0

展開されていないプロパティ参照を含む MSBuild プロパティを作成できます。その例を次に示します。

テキスト ファイル property.txt には 1 行が含まれます

$(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 に含まれるプロパティ参照を展開します。出来ますか?

4

2 に答える 2

1

ファイルにリストされている単一のプロパティの候補となるすべてのプロパティが事前にわかっている場合は、アイテム フィルタリングを使用してこれを行う方法があります。警告:

1) プロパティ関数を使用して文字列を解析する場合を除き、$(PropertyName) ではなく、ファイルに PropertyName のみを指定します。

2)以下のアプローチでは、ファイルに 1 行しか存在できません。複数行の場合は、追加のレベルのバッチ処理が必要になります。

<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 の内容は 1 行でした...

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)'

...条件を機能させるために、バッチ処理されたアイテムのメタデータがこれらの一時的なプロパティに転送されることに注意してください (これが、ファイルに 1 行のみを含めることができるため、アイテムが 1 つだけになる理由です)。

<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'

「SomeOtherProperty」を含むように property.txt を変更すると、次のようになります。

ChoosePropertyFromItem:
  LastLine='2'
于 2011-03-23T15:43:06.527 に答える
0

このような方法で新しいプロパティを作成することはできません。プロパティ名を動的に作成することはできません。ビルド プロセスを変更できます。例

 msbuild.exe yourproject.sln /p:UseSomeProp=true
于 2011-03-23T13:44:23.507 に答える