6

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

4

1 回答 1

9

从你问题的最后一句话和你对直接引用的强调让我觉得我知道你在追求什么:

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

设置

出于说明目的,我将[assembly: AssemblyVersion("1.0.*")]在我的AssemblyInfo.cs文件中使用该模式,并对每个项目进行几次单独的构建,以确保我的程序集得到一些不同的有趣版本。

确保每个项目都包含一个与项目同名的 .nuspec 文件。这对于 project 来说特别重要LibraryA,因为它是被引用的项目LibraryB。我会做这两个作为一个好的做法。现在让我们使用一个基本模板:

在下面,当您针对已构建的文件运行时,.nuspec替换标记将得到它们的值。$id$$version$nuget.exe.csproj

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

利用nuget pack -IncludeReferencedProjects

现在,我将从项目的解决方案目录 () 在nuget.exe命令行中运行:~LibraryB

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.

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

最后一件事,上面的命令将只创建 NuGet 包,LibraryB但显然你可以LibraryA通过再次运行它来创建一个LibraryA.csproj


我希望这是您所追求的,或者至少可以说明您可以做什么。

于 2016-05-29T09:20:27.317 回答