有条件地设置 <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>
进行不同的处理。
我有一个 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>
进行不同的处理。