MSBuild脚本默认属性最佳实践说明

MSBuild脚本默认属性最佳实践说明,msbuild,automation,Msbuild,Automation,在构建MSBuild脚本时,我需要定义一系列默认属性,这些属性在运行脚本时可以被重写。根据以下文章,您应该使用条件来默认属性: 微软如何推荐: <PropertyGroup> <MyProperty Condition="'$(MyProperty)' == '' ">Default Value</MyProperty> </PropertyGroup> 调用: msbuild build.xml/t:DefaultsTest/p:My

在构建MSBuild脚本时,我需要定义一系列默认属性,这些属性在运行脚本时可以被重写。根据以下文章,您应该使用条件来默认属性:

微软如何推荐:

<PropertyGroup>
    <MyProperty Condition="'$(MyProperty)' == '' ">Default Value</MyProperty>
</PropertyGroup>
调用:

msbuild build.xml/t:DefaultsTest/p:MyProperty=“overrided value”

如果您仅默认可从调用中重写的相同属性,请解释使用
条件
属性的好处

更新: 下面是一个完整的简单配置文件来演示:
defaults.xml

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="DefaultsTest" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <MyProperty Condition=" '$(MyProperty)' == '' ">MyProperty with Conditional</MyProperty>
        <MyOtherProperty>MyOtherProperty without Conditional</MyOtherProperty>
    </PropertyGroup>

    <Target Name="DefaultsTest">
        <Message Text="$(MyProperty)"></Message>
        <Message Text="$(MyOtherProperty)"></Message>
    </Target>
</Project>

带条件的MyProperty
不带条件的MyOtherProperty
这可以作为
msbuild defaults.xml


msbuild defaults.xml/p:MyProperty=“Changed Value”/p:MyOtherProperty=“Changed as well”

您正确地注意到,通过无条件地分配属性,可以实现所需的行为。以下项目在没有/p:override的情况下生成时,在命令行上会生成
默认值
。当使用命令msbuild myproj.proj/t:DefaultsTest/p:MyProperty=NewValue构建时,将生成
NewValue

 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <MyProperty>Default Value</MyProperty>
    </PropertyGroup>
    <Target Name="DefaultsTest">
        <Message Text="MyProperty=$(MyProperty)"></Message>
    </Target>
</Project>
将产生以下产出:

Prop1=Prop1 Default Value
Prop2=NewValue2

这意味着在一般情况下(如果您不能绝对确定属性是全局的还是局部的),使用默认值的条件赋值更安全,因为它总是有效的。

但是,其行为方式完全相同:不,它不是:如果MyProperty没有在别处指定(如命令行上),它将为空。但是,在使用推荐方法时,如果MyProperty未在其他地方指定,则其值将为“默认值”。使用
msbuild build.xml/t:DefaultsTest
调用这两种情况,您将看到不同之处。@stijn我按照您所说的那样进行了测试,并且无论条件是否存在,我都会收到节点的默认值。环境变量也存在问题。根据:“如果项目文件包含与环境变量同名的属性的显式定义,则项目文件中的属性将覆盖环境变量的值。”。通过检查属性是否已定义,环境属性将不会被覆盖。(注意,我还没有实际测试过这个)
 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <MyProperty>Default Value</MyProperty>
    </PropertyGroup>
    <Target Name="DefaultsTest">
        <Message Text="MyProperty=$(MyProperty)"></Message>
    </Target>
</Project>
 <Project TreatAsLocalProperty="Prop1;Prop2" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Prop1>Prop1 Default Value</Prop1>
        <Prop2 Condition="$(Prop2) == ''">Prop2 Default Value</Prop2>
    </PropertyGroup>
    <Target Name="DefaultsTest">
        <Message Text="Prop1=$(Prop1)"></Message>
        <Message Text="Prop2=$(Prop2)"></Message>
    </Target>
</Project>
msbuild b.proj /t:DefaultsTest /p:Prop1=NewValue1 /p:Prop2=NewValue2
Prop1=Prop1 Default Value
Prop2=NewValue2