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

如何在MSBuild的common.targets中条件配置GeneratePackageOnBuild属性

问题原因

你遇到的问题本质是 MSBuild 内置属性的赋值时机和导入顺序问题:

  • 你自定义的Rwv37WhatInThe属于私有属性,没有任何SDK或第三方导入逻辑会修改它,所以你静态PropertyGroup里的赋值会保留最终结果。
  • 而GeneratePackageOnBuild是.NET SDK打包逻辑的内置属性,你在静态PropertyGroup里对它的赋值,会被后续导入的SDK默认属性/目标逻辑覆盖。
    具体来说,.NET SDK 的Microsoft.Packaging.targets中对GeneratePackageOnBuild的默认赋值,或者测试SDK的相关逻辑,导入时机晚于你当前的common.targets静态属性组,你设的true值会被后续逻辑重新覆盖为false。

解决方案

方案1:将赋值逻辑放到目标中执行(最稳妥)

静态PropertyGroup的属性是在文件导入时立刻求值,容易被后续导入的逻辑覆盖,改成在属性全部初始化完成后的目标执行阶段赋值就不会出现该问题:

<Target Name="SetCustomGeneratePackageOnBuild" BeforeTargets="PrepareForBuild" Condition="'$(Rwv37UseOriginalGeneratePackageOnBuild)' == 'false'">
  <PropertyGroup>
    <GeneratePackageOnBuild Condition="'$(Rwv37TestProject)' == 'false'">true</GeneratePackageOnBuild>
    <GeneratePackageOnBuild Condition="'$(Rwv37TestProject)' != 'false'">false</GeneratePackageOnBuild>
  </PropertyGroup>
</Target>

这个目标会在构建准备阶段前执行,此时Rwv37TestProject等所有项目属性都已经完成初始化,赋值后的GeneratePackageOnBuild不会再被静态导入逻辑覆盖。

方案2:调整common.targets的导入位置

如果你不想改写成目标形式,也可以直接调整common.targets的导入时机:

  • 不要把当前的赋值逻辑放在Directory.Build.props或者项目文件开头的Import节点中,这两类导入都会早于SDK内置属性的赋值。
  • 把GeneratePackageOnBuild的赋值逻辑移到Directory.Build.targets文件中,或者在项目文件的末尾、SDK导入完成之后再Import你的common.targets,此时你的赋值会晚于SDK的默认赋值,不会被覆盖。

内容的提问来源于stack exchange,提问作者Bob Vesterman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:57:03