NuGet将项目引用定义为版本化依赖项

Mik*_*tsu 5 c# visual-studio nuget nuget-package nuspec

我的示例解决方案> Visual Studio中有2个项目库.我在另一个中直接引用其中一个.当我现在发布我的nuget包时,在依赖概述上我得到了我直接引用的nuget >= 1.0.0.0,当我通过nuget执行它时,引用意味着没有直接引用,因为相同的解决方案我在> =依赖概述下得到正确的版本号.我不会更改默认的依赖行为lowest.我试过的是用依赖项/ references/files元素更新我的nuspec文件,它们都不适用于我.我想在直接引用的nuget中看到相同版本的给定nuget作为依赖.

Fer*_*osa 7

我会尝试对你的问题做一个非平凡的解释,因为它没有得到很好的解释,但是最后一句话和你对直接引用的强调让我觉得我知道你在追求什么.如果我误解了你的问题,请耐心和道歉.

NuGet定义了一个-IncludeReferencedProjects选项,用于指示nuget.exe它应如何处理引用的项目,作为依赖项或作为包的一部分:

  • 如果引用的项目具有与项目具有.nuspec相同名称的相应文件,则将引用的项目添加为显式NuGet依赖项.
  • 否则,引用的项目将作为包的一部分添加.

我的猜测是你追求前者.

让我们将问题简化为最基本的形式:假设您有一个直接LibraryA引用LibraryB作为项目引用的解决方案.构建解决方案时,会将汇编输出LibraryA复制到LibraryB

~/
?   Solution.sln
????LibraryA
?   ?   ClassA.cs
?   ?   LibraryA.csproj
?   ?   LibraryA.nuspec
?   ????bin
?   ?   ????Debug
?   ?   ?       LibraryA.dll
?   ?   ?       LibraryA.pdb
?   ?   ????Release
?   ????Properties
?           AssemblyInfo.cs
????LibraryB
    ?   ClassB.cs
    ?   LibraryB.csproj
    ?   LibraryB.nuspec
    ????bin
    ?   ????Debug
    ?   ?       LibraryA.dll
    ?   ?       LibraryA.pdb
    ?   ?       LibraryB.dll
    ?   ?       LibraryB.pdb
    ?   ????Release
    ????Properties
            AssemblyInfo.cs
Run Code Online (Sandbox Code Playgroud)

确保您的项目包含具有相同名称的.nuspec文件.这对项目特别重要[assembly: AssemblyVersion("1.0.*")],因为它是被引用的项目.我会做这两个好的做法.现在让我们使用以下基本模板:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <authors>The author... (**mandatory element**)</authors>
    <description>Your description... (**mandatory element**)</description>
  </metadata>
</package>
Run Code Online (Sandbox Code Playgroud)

AssemblyInfo.cs上面,替换标记,LibraryA并在您对已构建的文件运行时LibraryB获取它们的值..nuspec$id$$version$

为了便于说明,我将nuget.exe在我的.csproj文件中使用,并将在每个项目上执行几个单独的构建,以确保我的程序集获得一些不同的有趣版本.

现在,我nuget pack -IncludeReferencedProjects将从解决方案目录(nuget.exe)运行命令行

PS> nuget pack .\LibraryB\LibraryB.csproj -IncludeReferencedProjects -Verbosity detailed
    Attempting to build package from 'LibraryB.csproj'.
    Packing files from '~\LibraryB\bin\Debug'.
    Using 'LibraryB.nuspec' for metadata.
    Add file '~\LibraryB\bin\Debug\LibraryB.dll' to package as 'lib\net451\LibraryB.dll'

    Id: LibraryB
    Version: 1.0.5993.6096
    Authors: The author... (**mandatory element**)
    Description: Your description... (**mandatory element**)
    Dependencies: LibraryA (= 1.0.5993.7310)

    Added file 'lib\net451\LibraryB.dll'.

    Successfully created package '~\LibraryB.1.0.5993.6096.nupkg'.
PS>
Run Code Online (Sandbox Code Playgroud)

这将创建~具有显式NuGet依赖关系的NuGet包LibraryB.

当您检查内容时LibraryB.1.0.5993.6096.nupkg,您将看到LibraryA.1.0.5993.7310.nupkg生成的LibraryB.1.0.5993.6096.nupkg所有.nuspec替换令牌将替换为所使用的实际版本.

最后一点,上面的命令只会创建NuGet包,nuget.exe但很明显你可以$version$通过再次运行它来创建一个LibraryB


我希望这就是你所追求的,或者至少可以为你能做的事情提供一些启示.