在一个解决方案中从多个项目创建一个NuGet包

时间:2013-04-08 15:13:59

标签: c# visual-studio-2010 teamcity nuget

我有一个我正在处理的解决方案,它包含4个类库项目(ABCD)。 AB可被视为解决方案中的顶级项目。 AB引用CD都是独立的。

这四个项目代表了我处理自动化工作流程的一组服务。它们都是密切相关的,只能在一个地方(服务经理)使用,所以我不想将它们分成不同的解决方案。

我的问题是我想创建一个包含所有4个库的NuGet包,而不必全部构建它们并手动收集它们的DLL。我知道我可以通过让AB引用其余的项目来实现这一点,但这不是真正的关系,我觉得应该避免。

我已经做了很多关于这个问题的搜索,除了手动收集DLL并自己构建包之外,我找不到解决方案。有没有办法用NuGet的功能/能力来实现我想要的结果?

注意:如果标签不清楚我正在使用VS2010和TeamCity构建服务器。如果它是相关的,我也通过Stash服务器使用Git。

编辑:我刚刚意识到这可能非常重要。这些项目确实引用了我需要标记为依赖项的其他NuGet包。

5 个答案:

答案 0 :(得分:15)

您必须定义自己的nuspec清单。您可以在files部分列出包含程序集:

<file src="A\bin\Release\A.dll" target="lib\net40" />
<file src="B\bin\Release\B.dll" target="lib\net40" />
...

有关详细信息,请参阅NuSpec reference

然后在NuPack构建步骤中引用该nuspec文件而不是proj。

答案 1 :(得分:13)

如果您已下载NuGet.exe 您可以运行:nuget pack Myproject.csproj -IncludeReferencedProjects,这应该包括您的所有项目。以下是NuGet docs的说明:

如果项目引用其他项目,则可以将引用的项目作为包的一部分添加,或者作为依赖项添加-IncludeReferencedProjects选项。这是递归完成的。例如,假设您有项目A.csproj,它引用B.csproj和C.csproj,而B.csproj引用D.csproj&amp; E.csproj,C.csproj引用了F.csproj&amp; G.csproj。然后,当你运行:

nuget pack A.csproj -IncludeReferencedProjects

生成的包将包含来自项目B,C,D,E,F&amp; B的文件。 G,除了来自项目A的文件。

如果引用的项目具有相同名称的相应nuspec文件,则该引用的项目将作为依赖项添加。使用相同的示例,假设现在文件C.nuspec与项目文件C.csproj位于同一目录中。当你跑:

nuget pack A.csproj -IncludeReferencedProjects

生成的包将包含项目B,D,E中的文件以及项目A中的文件,并且包依赖于C。

另请参阅Command line reference

答案 2 :(得分:3)

2020更新

我个人更喜欢在可能的地方使用dotnet命令。

我发现可以解决的解决方案是如下更改主项目<ProjectReference></ProjectReference>中的默认项目引用

  <ItemGroup>
    <ProjectReference Include="..\{ProjectFolder}\{ProjectName}.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>{ProjectName}.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup> 

已确认此解决方案在定位netstandard2.0及更高版本时有效。

答案 3 :(得分:0)

如果您在 VS 中有多个项目并且您的 Pack 文件依赖于另一个项目,则两者都需要打包。先打包依赖,然后打包你的项目。使用 NuGet 包管理器添加包时,请确保您的源不是 nuget.org,而是您的测试文件夹。除非您已将两者都上传到 Nuget.org。 How do I install a NuGet package .nupkg file locally?

答案 4 :(得分:-1)

这可能会解决这个问题: nuget.exe pack proj.csproj -IncludeReferencedProjects

你可以看到: Create nuget package for a solution with multiple projects