如何使用dotnet pack将多个项目打包为单个nupkg包
结论
dotnet pack 原生支持将多个库打包到同一个nupkg文件,常用两种实现方案:
方案1:通过nuspec文件打包
这是最灵活的方案,适合需要自定义包结构的场景:
- 在你的代码库根目录新建 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>
- 修改你的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,适合依赖关系复杂的场景:
- 新建一个空的类库项目(如
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>
- 修改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
相关产品推荐
相关产品推荐

