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

时间:2016-05-25 18:37:31

标签: c# visual-studio nuget nuget-package nuspec

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

1 个答案:

答案 0 :(得分: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

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

<?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>

在上面的.nuspec中,当您针对$id$运行$version$时,替换令牌inferrednuget.exe将获得其值.csproj已构建的文件。

为了便于说明,我将在我的[assembly: AssemblyVersion("1.0.*")]文件中使用AssemblyInfo.cs,并在每个项目上执行几个单独的构建,以确保我的程序集获得一些不同的有趣版本。

现在,我将从解决方案目录(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>

这将创建NuGet包LibraryB.1.0.5993.6096.nupkg,其具有与LibraryA.1.0.5993.7310.nupkg的显式NuGet依赖关系。

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

最后一点,上面的命令只会为LibraryB创建NuGet包,但显然你只需再次针对LibraryA再次运行它来为LibraryA.csproj创建一个<{1}}

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