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