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

打包预发布NuGet包时,如何同时启用IncludeReferencedProjects并指定版本

问题背景

我有个基于.NET Framework 4.8.1的解决方案,里面好几个类库都依赖同方案里的SharedProject项目引用。理想的NuGet包结构应该是这样:

ClassLibrary1.dll
  -> SharedProject.dll

ClassLibrary2.dll
  -> SharedProject.dll
...

现在碰到个两难的情况:

  1. 用下面的配置打包,能正常生成带-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'
  1. 要是关掉版本控制,加上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文件,手动控制包内容和版本

  1. 给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>
  1. 流水线里改用这个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:45:35