打包预发布NuGet包时,如何同时启用IncludeReferencedProjects并指定版本
问题背景
我有个基于.NET Framework 4.8.1的解决方案,里面好几个类库都依赖同方案里的SharedProject项目引用。理想的NuGet包结构应该是这样:
ClassLibrary1.dll -> SharedProject.dll ClassLibrary2.dll -> SharedProject.dll ...
现在碰到个两难的情况:
- 用下面的配置打包,能正常生成带
-prerelease后缀的预发布包或者正式包,但包里只有ClassLibrary1.dll,依赖的SharedProject.dll没被包含进去:
variables: PrereleaseVersion: '$(build.buildNumber)-prerelease' ReleaseVersion: '$(build.buildNumber)' ... - task: NuGetCommand@2 displayName: 'Pack Prerelease Nuget Package' inputs: command: pack packagesToPack: $(project) versioningScheme: 'byEnvVar' versionEnvVar: 'PrereleaseVersion'
- 要是关掉版本控制,加上
includeReferencedProjects参数,倒是能把ClassLibrary1.dll和SharedProject.dll都打包进去,但版本号只能用程序集自带的ClassLibrary1.Major.Minor.Build格式,没法加-prerelease后缀:
- task: NuGetCommand@2 displayName: 'Pack Prerelease Nuget Package' inputs: command: pack packagesToPack: $(project) versioningScheme: 'off' includeReferencedProjects: true
想找个办法,既能把SharedProject.dll包含进NuGet包,又能自定义版本号(包括加预发布后缀)。
解决思路
给你两个可行的方案:
方案一:自定义Nuspec文件,手动控制包内容和版本
- 给ClassLibrary1建个自定义的
.nuspec文件,里面明确指定要包含的文件和版本变量:
<?xml version="1.0"?> <package> <metadata> <id>ClassLibrary1</id> <version>$version$</version> <!-- 这里填你的包名称、描述等其他元数据 --> <dependencies> <dependency id="SharedProject" version="$version$" /> </dependencies> </metadata> <files> <!-- 加入ClassLibrary1的输出文件 --> <file src="bin\Release\ClassLibrary1.dll" target="lib\net481" /> <file src="bin\Release\ClassLibrary1.pdb" target="lib\net481" /> <!-- 加入SharedProject的输出文件,注意路径要和你的项目结构匹配 --> <file src="..\SharedProject\bin\Release\SharedProject.dll" target="lib\net481" /> <file src="..\SharedProject\bin\Release\SharedProject.pdb" target="lib\net481" /> </files> </package>
- 流水线里改用这个nuspec文件打包,通过
properties参数传入自定义版本:
- task: NuGetCommand@2 displayName: 'Pack Prerelease Nuget Package' inputs: command: pack packagesToPack: '**\ClassLibrary1.nuspec' versioningScheme: 'off' properties: 'version=$(PrereleaseVersion)'
方案二:改用DotNetCoreCLI任务打包
如果你的流水线支持dotnet命令,直接用DotNetCoreCLI@2任务,同时指定include-referenced-projects参数和自定义版本:
- task: DotNetCoreCLI@2 displayName: 'Pack Prerelease Nuget Package' inputs: command: 'pack' packagesToPack: '$(project)' versioningScheme: 'byEnvVar' versionEnvVar: 'PrereleaseVersion' arguments: '--include-referenced-projects'
这个方法对.NET Framework项目也适用,前提是你已经安装了合适版本的.NET SDK,而且项目文件配置没问题。
注意事项
- 要确保SharedProject的输出路径和ClassLibrary1一致,或者在nuspec里写对相对路径。
- 用
dotnet pack的话,最好在ClassLibrary1的.csproj里加上<GeneratePackageOnBuild>false</GeneratePackageOnBuild>,避免重复打包。
内容的提问来源于stack exchange,提问作者Nerrickk
相关产品推荐
相关产品推荐

