You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多个.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:18:42