我可以创建MSBuild属性,其中包含未展开的属性引用。以下是它的例子:
文本文件property.txt包含单行
$(SomeProperty)
可以使用msbuild脚本进行处理,如下所示:
<ItemGroup>
<PropertyFile Include="property.txt"/>
</ItemGroup>
<!-- Standart task for file reading -->
<ReadLinesFromFile File="@(PropertyFile)" >
<Output
TaskParameter="Lines"
ItemName="ItemsFromFile"/>
</ReadLinesFromFile>
<!-- Property LastLine now has value $(SomeProperty) -->
<PropertyGroup>
<LastLine>%(ItemsFromFile.Identity)</LastLine>
</PropertyGroup>
<Message Text="$(LastLine)"/>
<ItemGroup>
<PropertyFile Include="property.txt"/>
</ItemGroup>
<!-- Standart task for file reading -->
<ReadLinesFromFile File="@(PropertyFile)" >
<Output
TaskParameter="Lines"
ItemName="ItemsFromFile"/>
</ReadLinesFromFile>
<!-- Property LastLine now has value $(SomeProperty) -->
<PropertyGroup>
<LastLine>%(ItemsFromFile.Identity)</LastLine>
</PropertyGroup>
<Message Text="$(LastLine)"/>
现在我想扩展属性引用,它包含在CurrentLine中。有可能吗?
答案 0 :(得分:0)
您无法以这种方式创建新属性。您无法动态创建属性名称。您可以修改构建过程。实施例
msbuild.exe yourproject.sln /p:UseSomeProp=true
答案 1 :(得分:0)
如果您事先知道作为文件中列出的单个属性的所有属性,则可以使用项目过滤来执行此操作。 注意事项:
1)除非你想使用属性函数解析字符串,否则只指定文件中的PropertyName,而不是$(PropertyName)。
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>
上面的构造建立了两个候选属性,$(SomeProperty)和$(SomeOtherProperty)。对于此示例,property.txt的内容是单行...
SomeProperty
...与$(SomeProperty)相关,其值为1
<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>
以上是下面主要目标的两个依赖目标。它们使用依赖目标来读取文件,以便将其发布到项目组中,以便与@(ChooseProperty)项目组上的目标批处理一起使用。要注意的关键是创建@(_ FilteredItems)项目组的条件,由于这个原因,它将包含一个成员......
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>
...最后从@(_ FilteredItems)中的单个项目中提取$(LastLine)属性。结果输出如下:
ChoosePropertyFromItem:
LastLine='1'
更改property.txt以包含'SomeOtherProperty'会导致:
ChoosePropertyFromItem:
LastLine='2'