如何重新评估MSBuild属性
我可以创建MSBuild属性,该属性包含未展开的属性引用。下面是一个例子: 文本文件property.txt包含一行 $SomeProperty 可以使用以下msbuild脚本对其进行处理:如何重新评估MSBuild属性,msbuild,msbuild-propertygroup,Msbuild,Msbuild Propertygroup,我可以创建MSBuild属性,该属性包含未展开的属性引用。下面是一个例子: 文本文件property.txt包含一行 $SomeProperty 可以使用以下msbuild脚本对其进行处理: 现在我想展开属性引用,它包含在CurrentLine中。有可能吗?您不能以这种方式创建新属性。无法动态创建属性名称。您可以修改生成过程。范例 msbuild.exe yourproject.sln /p:UseSomeProp=true 如果您事先知道文件中列出的单个属性的所有候选属性,则可以通过项
现在我想展开属性引用,它包含在CurrentLine中。有可能吗?您不能以这种方式创建新属性。无法动态创建属性名称。您可以修改生成过程。范例
msbuild.exe yourproject.sln /p:UseSomeProp=true
如果您事先知道文件中列出的单个属性的所有候选属性,则可以通过项目筛选实现这一点。 注意事项: 1仅指定文件中的PropertyName,而不是$PropertyName,除非要使用property函数解析字符串 2使用下面的方法,文件中只能有一行,对于多行,您将需要额外的批处理级别
<ItemGroup>
<PropertyFile Include="property.txt" />
</ItemGroup>
<PropertyGroup>
<SomeProperty>1</SomeProperty>
<SomeOtherProperty>2</SomeOtherProperty>
</PropertyGroup>
<ItemGroup>
<ChooseProperty Include="SomeProperty">
<Value>$(SomeProperty)</Value>
</ChooseProperty>
<ChooseProperty Include="SomeOtherProperty">
<Value>$(SomeOtherProperty)</Value>
</ChooseProperty>
</ItemGroup>
…它与值为1的$SomeProperty相关
<Target Name="ReadItems">
<ReadLinesFromFile File="@(PropertyFile)">
<Output
TaskParameter="Lines"
ItemName="ItemsFromFile"
/>
</ReadLinesFromFile>
</Target>
<Target Name="FilterItems"
Outputs="%(ChooseProperty.Identity)">
<PropertyGroup>
<_ThisProperty>%(ChooseProperty.Identity)</_ThisProperty>
<_ThisValue>%(ChooseProperty.Value)</_ThisValue>
<_ItemFromFile>%(ItemsFromFile.Identity)</_ItemFromFile>
</PropertyGroup>
<ItemGroup Condition="'$(_ItemFromFile)' == '$(_ThisProperty)'">
<_FilteredItems Include="$(_ThisProperty)">
<Value>$(_ThisValue)</Value>
</_FilteredItems>
</ItemGroup>
</Target>
…请注意,批处理项元数据被传输到这些临时属性,以便使条件生效,这就是文件只能包含一行的原因,因此只有一个项
<Target Name="ChoosePropertyFromItem"
DependsOnTargets="ReadItems;FilterItems">
<!-- Standard task for file reading -->
<PropertyGroup>
<LastLine>%(_FilteredItems.Value)</LastLine>
</PropertyGroup>
<Message Text="LastLine='$(LastLine)'" />
</Target>
将property.txt更改为包含“SomeOtherProperty”将导致以下结果:
ChoosePropertyFromItem:
LastLine='2'
Condition="'$(_ItemFromFile)' == '$(_ThisProperty)'
<Target Name="ChoosePropertyFromItem"
DependsOnTargets="ReadItems;FilterItems">
<!-- Standard task for file reading -->
<PropertyGroup>
<LastLine>%(_FilteredItems.Value)</LastLine>
</PropertyGroup>
<Message Text="LastLine='$(LastLine)'" />
</Target>
ChoosePropertyFromItem:
LastLine='1'
ChoosePropertyFromItem:
LastLine='2'