有条件地设置 <GeneratePackageOnBuild> 的值?

Setting value of <GeneratePackageOnBuild> conditionally?

我有一个 common.targets 文件,我将其包含在我几乎所有项目的“主要”项目文件中,以处理我想在几乎所有项目中完成的 MSBuild 工作。它包括(除其他外)我想要的各种内置属性的默认值。大多数时候,我用 [MSBuild]::ValueOrDefault 处理它;例如:

  <PropertyGroup>
    <Authors>$([MSBuild]::ValueOrDefault('$(Authors)', 'Robert William Vesterman'))</Authors>
  </PropertyGroup>

但是,对于某些内置属性,在 属性 组被调用时,MSBuild(或其他东西)已经为 属性 提供了默认值。例如,如果您没有在 <Project> 中明确指定,<GeneratePackageOnBuild> 将被赋予值 false。所以,[MSBuild]::ValueOrDefault 的想法并不适用。

在这种情况下,我使用我自己的 属性,默认为 false,以控制实际 属性 的值应该默认为 MSBuild 的默认值还是我的首选默认。例如:

  <PropertyGroup>
    <Rwv37UseOriginalGeneratePackageOnBuild>$([MSBuild]::ValueOrDefault('$(Rwv37UseOriginalGeneratePackageOnBuild)', 'false'))</Rwv37UseOriginalGeneratePackageOnBuild>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Rwv37UseOriginalGeneratePackageOnBuild)' == 'false'">
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>

这对我来说效果很好(特别是 <GeneratePackageOnBuild> 和其他几个属性)。但是,我最近想将其更改为我的测试项目的默认值 false。所以:

  <PropertyGroup Condition="'$(Rwv37UseOriginalGeneratePackageOnBuild)' == 'false'">
    <GeneratePackageOnBuild Condition="'$(Rwv37TestProject)' == 'false'">true</GeneratePackageOnBuild>
    <GeneratePackageOnBuild Condition="'$(Rwv37TestProject)' != 'false'">false</GeneratePackageOnBuild>
  </PropertyGroup>

但是现在<GeneratePackageOnBuild>总是false,我不明白为什么。在进行故障排除时,我最终得到了另一个我认为我正在以相同方式处理的 属性,并输出了所涉及的各种属性的值:

  <PropertyGroup Condition="'$(Rwv37UseOriginalGeneratePackageOnBuild)' == 'false'">
    <Rwv37WhatInThe         Condition="'$(Rwv37TestProject)' == 'false'">true</Rwv37WhatInThe>
    <GeneratePackageOnBuild Condition="'$(Rwv37TestProject)' == 'false'">true</GeneratePackageOnBuild>
    <Rwv37WhatInThe         Condition="'$(Rwv37TestProject)' != 'false'">false</Rwv37WhatInThe>
    <GeneratePackageOnBuild Condition="'$(Rwv37TestProject)' != 'false'">false</GeneratePackageOnBuild>
  </PropertyGroup>
  <Warning Text="UseOrig: $(Rwv37UseOriginalGeneratePackageOnBuild)" />
  <Warning Text="Test: $(Rwv37TestProject)" />
  <Warning Text="Gen: $(GeneratePackageOnBuild)" />
  <Warning Text="What: $(Rwv37WhatInThe)" />

因此,对于满足 属性 组条件的任何给定项目,我希望 <Rwv37WhatInThe><GeneratePackageOnBuild> 的值彼此相等。但实际上,如果我构建一个包含一个测试项目和一个非测试项目的解决方案,我会收到以下警告:

UseOrig: false
Test: false
Gen: false
What: true
UseOrig: false
Test: true
Gen: false
What: false

请注意,对于测试项目,一切都如我所料——即 <GeneratePackageOnBuild><Rwv37WhatInThe> 都是 false。但是在非测试项目中,虽然 <Rwv37WhatInThe> 是我所期望的 (true),但令我困惑的是 <GeneratePackageOnBuild>false.

我也尝试过各种“无法修复”的小东西(即我认为无关紧要的东西),只是有可能我对它们的看法是错误的。例如,尝试 != 'true' 而不是 == 'false' 之类的东西。我尝试过的任何事情都没有帮助。

我在这里做错了什么,我怎样才能让它按照我想要的方式运行?谢谢。

编辑:我可能应该提到我正在使用 VS2019 进行构建,项目是 C# 9 .Net 5.0 库。

编辑 #2: 我相信我已经弄明白了。请参阅下面我的回答。

回答我自己的问题:

发布这个问题后,我回到我一直在做的事情,并构建了解决方案。它的工作完全符合我的预期。我之前没有构建测试项目。我之前说过“当我构建时”之类的话,实际上我正在做的是查看 VS2019 的“错误列表”and/or 项目 属性 页面,这两个页面都会根据您的 .csproj 实际更改进行更新时间,不管你是否真的“建造”了。

所以,我猜想 MSBuild(或其他东西)根据项目是否已经实际构建而对 <GeneratePackageOnBuild> 进行不同的处理。