MSBuildプロパティを再評価する方法
-
28-10-2019 - |
質問
未使用のプロパティリファレンスを含む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)"/>
次に、CurrentLineに含まれるプロパティリファレンスを拡大したいと考えています。出来ますか?
解決
ファイルにリストされている単一のプロパティであるための候補であるすべてのプロパティを事前に知っている場合、アイテムフィルタリングでこれを行う方法があります。警告:
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)の2つの候補特性を確立します。この例では、Property.txtの内容は単一の行でした...
SomeProperty
... 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>
上記は、以下の主要なターゲットの2つの従属ターゲットです。依存ターゲットを使用してファイルを読み取り、 @(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>
...最後に、$(lastLine)プロパティは、 @(_ filtereditems)の単一アイテムから引き出されます。結果の出力は以下のとおりです。
ChoosePropertyFromItem:
LastLine='1'
Property.txtを「sometherproperty」を含むように変更すると、これは次のとおりです。
ChoosePropertyFromItem:
LastLine='2'
他のヒント
このような方法で新しいプロパティを作成することはできません。動的にプロパティ名を作成することはできません。ビルドプロセスを変更できます。例
msbuild.exe yourproject.sln /p:UseSomeProp=true