如何将多个.NET Standard SDK项目打包为单个NuGet包
问题背景
现有3个.NET Standard SDK项目,分别为Utils、Reporting和Testing,需要将其打包为名为Shared的单个NuGet包,上传至本地包管理系统供其他项目调用。要求直接通过csproj文件配置所有包信息,无需额外使用nuspec文件。
最初尝试新建名为Shared的.NET Standard项目作为聚合入口,引用前述3个业务项目,仅在Shared.csproj中完成所有包配置,配置内容如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <Copyright>Copyright (c) Me</Copyright> <GeneratePackageOnBuild>False</GeneratePackageOnBuild> <SkipCopyBuildProduct>true</SkipCopyBuildProduct> <GenerateDependencyFile>False</GenerateDependencyFile> <DebugSymbols>false</DebugSymbols> <DebugType>none</DebugType> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\Utils.csproj" /> <ProjectReference Include="..\Reporting.csproj" /> <ProjectReference Include="..\Testing.csproj" /> </ItemGroup> </Project>
先后尝试两种打包命令均无法生成预期的NuGet包:
- msbuild命令:
dotnet msbuild -t:pack=Shared.csproj;-p:Configuration=Release;PackageOutputPath=.\release;
- NuGet CLI命令:
nuget pack Shared.csproj -Build -IncludeReferencedProjects -Prop Configuration=Release
后续调整时尝试去掉单独的聚合Shared项目,直接基于业务项目打包,但生成的nupkg文件lib文件夹中未包含3个项目的完整内容,不确定是否需要在dependencies.group配置节点中逐一指定每个引用项目。
可行方案
- 打包工具优先选
dotnet pack,不要用旧版NuGet CLI的nuget pack命令。后者对SDK风格csproj的兼容性很差,多数配置无法正确识别,是之前打包失败的核心原因之一。 - 不管是保留独立的Shared聚合项目,还是选三个业务项目中的一个作为包入口(包ID配置为Shared即可),要让被引用项目的dll直接进入包的lib目录、而非被识别为外部NuGet依赖,不需要手动编辑dependencies.group节点,只要给所有
ProjectReference节点加上两个属性:
<ItemGroup> <ProjectReference Include="..\Utils.csproj"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>all</IncludeAssets> </ProjectReference> <ProjectReference Include="..\Reporting.csproj"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>all</IncludeAssets> </ProjectReference> <ProjectReference Include="..\Testing.csproj"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>all</IncludeAssets> </ProjectReference> </ItemGroup>
默认配置下,项目引用会被标记为当前包的外部依赖,不会把对应dll打进包内。加上这两个属性后,打包流程会直接将被引用项目的输出文件合并到当前包的lib目录下。
- 修正打包命令,之前的msbuild参数写法有误,使用标准dotnet pack命令即可,参数简单不容易出错:
dotnet pack Shared.csproj -c Release -o ./release
- 三个业务项目如果依赖其他第三方NuGet包,打包时会自动识别为Shared包的对外依赖,不需要手动在配置中逐一添加,打包流程会自动生成正确的依赖声明节点。
内容的提问来源于stack exchange,提问作者Misi
相关产品推荐
相关产品推荐

