在一个解决方案中从多个项目创建一个NuGet包
本文关键字:一个 创建 NuGet 项目 解决方案 | 更新日期: 2023-09-27 18:08:09
我有一个解决方案,我正在研究包含4类库项目(A
, B
, C
, D
)的解决方案。A
和B
可以被认为是解决方案中的顶级项目。A
和B
均参考C
, D
独立存在。
这四个项目代表了一组处理自动化工作流的服务。它们都是密切相关的,并且只会在一个位置(服务管理器)中使用,所以我不想将它们分成不同的解决方案。
我的问题是,我想创建一个单独的NuGet包,它将包含所有4个库,而不必手动构建它们并收集它们的dll。我知道我可以通过让A
或B
引用剩余的项目在技术上实现这一点,但这不是真正的关系,我觉得应该避免。
我在这个问题上做了很多搜索,除了手动收集dll并自己构建包之外,我找不到解决方案。是否有一种方法可以实现我想要使用NuGet的功能/能力的结果?
注:如果标签不清楚我目前使用VS2010与TeamCity构建服务器。如果它是相关的,我也使用Git通过一个Stash服务器。
EDIT:我刚刚意识到这可能很重要,需要提及。这些项目确实引用了我需要标记为依赖项的其他NuGet包。
如果您已经下载了NuGet.exe你可以运行:nuget pack Myproject.csproj -IncludeReferencedProjects
,这应该包括你所有的项目。下面是NuGet文档中的注释:
如果项目引用了其他项目,您可以添加被引用的项目作为包的一部分,或者使用- inclereferencedprojects选项作为依赖项。这是递归地完成的。例如,假设您有A.csproj项目,它引用B.csproj和C.csproj,而B.csproj引用D.csproj;C.csproj参考文献F.csproj &G.csproj。然后,当你运行:
nuget pack A.csproj -IncludeReferencedProjects
生成的包将包含来自项目B、C、D、E、F等的文件;G,除了项目a中的文件之外。
如果一个被引用的项目有一个相应的同名的nuspec文件,那么这个被引用的项目将作为依赖项添加。使用相同的示例,假设现在在与项目文件c.s csproj相同的目录中有文件C.nuspec。当你运行:
nuget pack A.csproj -IncludeReferencedProjects
生成的包将包含来自项目B, D, E的文件,以及来自项目A的文件,并且包依赖于c。
请参阅命令行参考
您必须定义您自己的nuspec清单。你可以列出files
部分中包含的程序集:
<file src="A'bin'Release'A.dll" target="lib'net40" />
<file src="B'bin'Release'B.dll" target="lib'net40" />
...
详细信息请参阅NuSpec参考。
然后在NuPack构建步骤中引用nuspec文件,而不是proj.
2020 UPDATE
我个人更倾向于尽可能使用dotnet
命令。
适合我的解决方案是更改主项目<ProjectReference></ProjectReference>
中的默认项目引用,如下所示:
<ItemGroup>
<ProjectReference Include="..'{ProjectFolder}'{ProjectName}.csproj">
<ReferenceOutputAssembly>true</ReferenceOutputAssembly>
<IncludeAssets>{ProjectName}.dll</IncludeAssets>
</ProjectReference>
</ItemGroup>
此解决方案在针对netstandard2.0
及以上时被证实有效。
Microsoft不建议在一个包中包含多个程序集。但如果你真的想这么做,那就这样做吧:打开主项目文件并替换如下内容:
<ItemGroup>
<ProjectReference Include="..'SecondClassLibrary'SecondClassLibrary.csproj" />
</ItemGroup>
:
<ItemGroup>
<ProjectReference Include="..'SecondClassLibrary'SecondClassLibrary.csproj" PrivateAssets="all" />
</ItemGroup>
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
<ItemGroup>
<BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))" />
</ItemGroup>
</Target>
来源:https://github.com/NuGet/Home/issues/3891
这可能会解决这个确切的:Nuget.exe包项目。csproj -IncludeReferencedProjects
可以看到:为包含多个项目的解决方案创建nuget包
如果你在VS中有多个项目,并且你的Pack文件依赖于另一个项目,那么这两个项目都需要打包。首先打包依赖项,然后打包项目。当使用NuGet包管理器添加包时,请确保您的源代码不是nuget.org,而是您的测试文件夹。除非你都上传到Nuget.org。如何在本地安装NuGet包。nupkg文件?