You need to enable JavaScript to run this app. 如何使用dotnet pack将多个项目打包为单个nupkg包
优惠活动
大模型
产品
解决方案
定价
更多

如何使用dotnet pack将多个项目打包为单个nupkg包

结论

dotnet pack 原生支持将多个库打包到同一个nupkg文件,常用两种实现方案:


方案1:通过nuspec文件打包

这是最灵活的方案,适合需要自定义包结构的场景:

  1. 在你的代码库根目录新建 nuspec 配置文件,示例内容如下:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>Framework.Bundle</id>
    <version>1.0.0</version>
    <authors>你的作者名</authors>
    <description>Framework 统一包</description>
    <dependencies>
      <!-- 按需添加公共依赖 -->
    </dependencies>
  </metadata>
  <files>
    <!-- 把所有编译好的dll添加到包对应目录,示例适配net6.0,可按需替换目标框架 -->
    <file src="Framework/**/bin/$(Configuration)/**/*.dll" target="lib/net6.0" exclude="**/*.Test.dll" />
  </files>
</package>
  1. 修改你的YAML打包任务,直接指向该nuspec文件即可:
- task: DotNetCoreCLI@2
  displayName: 'Create unified nuget package'
  inputs:
    command: 'pack'
    packagesToPack: 'Framework.Bundle.nuspec'
    packDirectory: '$(Build.ArtifactStagingDirectory)/packages/nuget'
    nobuild: true
    versioningScheme: 'byBuildNumber'

方案2:通过空捆绑项目打包

该方案不需要手动维护nuspec,适合依赖关系复杂的场景:

  1. 新建一个空的类库项目(如Framework.Bundle.csproj),项目本身不需要业务代码,仅需要将所有需要打包的库项目添加为它的项目引用,然后修改该项目的csproj配置:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageId>Framework.Bundle</PackageId>
    <!-- 不打包当前空项目的输出 -->
    <IncludeBuildOutput>false</IncludeBuildOutput>
    <!-- 禁止将项目引用转为依赖包,而是把dll直接打进包内 -->
    <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
  </PropertyGroup>

  <ItemGroup>
    <!-- 添加所有需要打包的项目引用 -->
    <ProjectReference Include="../ProjectA/ProjectA.csproj" />
    <ProjectReference Include="../ProjectB/ProjectB.csproj" />
    <!-- 其他项目按需添加 -->
  </ItemGroup>

  <!-- 自动把所有引用项目的dll包含到打包输出中 -->
  <Target Name="IncludeAllReferenceDlls" AfterTargets="Build">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
    </ItemGroup>
  </Target>
</Project>
  1. 修改YAML打包任务,仅打包这个空项目即可:
- task: DotNetCoreCLI@2
  displayName: 'Create unified nuget package'
  inputs:
    command: 'pack'
    packagesToPack: 'Framework.Bundle/Framework.Bundle.csproj'
    packDirectory: '$(Build.ArtifactStagingDirectory)/packages/nuget'
    nobuild: true
    versioningScheme: 'byBuildNumber'

注意事项

  • 两种方案都兼容你原来的byBuildNumber版本号规则和nobuild配置,不需要额外调整其他流水线逻辑
  • 如果你的库需要支持多目标框架,只需要在nuspec或者捆绑项目中配置对应多目标框架规则即可

内容的提问来源于stack exchange,提问作者Mark Cooper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 12:30:05