为什么这个MSBuild脚本没有按照我的预期设置属性?

5

我想为一个MSBuild属性设置默认值。假设我从这里开始:

<Choose>
    <When Condition="..something..">
        <PropertyGroup>
            ...
            <MySetting>true</MySetting>
        <PropertyGroup>
    </When>
    ...
</Choose>

如果条件不成立,那么MySetting将是''。所以这应该将其设置为false吗?
<PropertyGroup>
    <MySetting Condition="'$(MySetting)'==''">false</MySetting>
</PropertyGroup>

以后,我想在条件语句中使用MySetting而无需测试“== 'true'”,像这样:
<PropertyGroup Condition="$(MySetting)">
    ...
</PropertyGroup>

当我在Visual Studio中加载这个项目时,它抱怨指定的条件"$(MySetting)"计算结果为""而不是布尔值。
因此,看起来我的检查条件是错误的,它检查“”以将属性赋值为false。我做错了什么?
2个回答

6
在MSBuild中,您正在处理字符串,因此您会得到''而不是false...如果您想将其默认为'false'并通过命令行进行覆盖,请在脚本中的现有条件块上方声明一个属性组:
<PropertyGroup>
    <MySetting>false</MySetting>
</PropertyGroup>

您可以在以下条件块中将其设置为true,或者也可以通过命令行进行设置,如下所示:

MSBuild.exe MyMSBuildFile.csproj /p:MySetting=true

这是设置默认值的更好方式。我会使用这种方法,谢谢。但是我仍然不明白为什么原始问题中的中间代码块没有将属性设置为false。我正在使用 '' 进行测试以将属性设置为false。为什么它不能运行? - scobi
@Scott Bilas:只是好奇,试试在顶部加上这个:<PropertyGroup><MySetting Condition="'$(MySetting)'==''">false</MySetting></PropertyGroup> - Nick Craver
好的,我尝试了一下,但没有任何变化。我还尝试添加了一些块来定义MySetting,例如<PropertyGroup><MySetting/></PropertyGroup>,但仍然不行。 - scobi
哇,我收回之前的话。问题在于我需要重新启动Visual Studio而不仅仅是关闭/重新打开SLN才能使目标文件更改生效。很奇怪,因为我所做的每一个更改都会在重新加载SLN时生效。所以其实并没有问题,尽管我很高兴得到了您更好的设置默认值的方法。谢谢。 :) - scobi
1
@Scott Bilas:很高兴它对你有用……我也花了一些时间来正确设置我们的构建,因为我必须一边学习MSBuild,这绝对是一个独特的野兽。 - Nick Craver
显示剩余2条评论

3

如果您想更好地声明属性的默认值,那么除了使用Chose之外,还可以在属性上进行设置:

<PropertyGroup>
    <MySetting Condition=" '$(MySetting)'=='' ">true</MySetting>
</PropertyGroup>

无论你处理的是应该是布尔值的内容,都要始终将左右两侧用 '' 包围起来作为条件。因此,请将第二个属性组改为以下格式:

<PropertyGroup Condition=" '$(MySetting)'=='true' ">
</PropertyGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接