如何在构建服务器上通过项目引用管理Nuget包依赖版本
可行解决方案
方案1(零代码改动,优先推荐)
你遇到的问题本质是通过/p:Version传入的是全局MSBuild属性,会覆盖所有被引用项目的自身Version配置,导致项目B的版本被强制覆盖为A的版本。
只需要把你给项目A传递的构建参数从/p:Version={A的版本号}改成/p:PackageVersion={A的版本号}即可:
- Nuget打包时会优先采用
PackageVersion作为当前项目的包版本,没有配置该属性时才会 fallback 到Version - 传入
PackageVersion不会影响其他被引用项目的版本配置,项目B的版本会保持你预设的2.0.0,或是构建服务器给B单独指定的版本号 - 完全不需要修改项目文件,本地项目引用的调试能力不受任何影响
如果你的构建服务器需要给项目B也单独指定版本,构建B的时候单独传递/p:PackageVersion={B的版本号}参数即可,两个项目的版本配置完全独立。
方案2(兼容必须传Version参数的场景)
如果你的构建流程已经固化,不能修改传入的参数名,可以修改项目A中对项目B的引用配置,禁止全局Version参数传递给B项目:
在A的.csproj文件中找到对B的ProjectReference节点,新增GlobalPropertiesToRemove配置:
<ProjectReference Include="..\你的B项目路径\B.csproj"> <!-- 原有配置保持不变,新增下面这行 --> <GlobalPropertiesToRemove>Version</GlobalPropertiesToRemove> </ProjectReference>
修改完成后,即使你给A的构建命令传入/p:Version={A的版本号},该参数也不会传递到B项目,B的版本会保留自身配置,打包生成的A包依赖的B版本也会是正确值,同时本地项目引用的调试能力完全不受影响。
方案验证
上述两个方案都完全满足你提出的所有要求:
- 构建服务器可以分别给A、B指定独立的版本号,生成对应版本的Nuget包
- 生成的Package A依赖的B版本就是B自身的对应版本,不会被A的版本覆盖
- 项目A保留对B的常规项目引用,本地调试、断点能力完全正常
内容的提问来源于stack exchange,提问作者Leon Zhou
相关产品推荐
相关产品推荐

