Как переоценить свойство MSBuild

Я могу создать свойство 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. Является ли это возможным?


person Nick    schedule 23.03.2011    source источник


Ответы (2)


Если вы заранее знаете все свойства, которые являются кандидатами на то, чтобы быть одним свойством, перечисленным в файле, есть способ сделать это с помощью фильтрации элементов. Предостережения:

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>

... наконец, свойство $(LastLine) извлекается из одного элемента в @(_FilteredItems). Полученный результат ниже:

ChoosePropertyFromItem:
  LastLine='1'

Изменение property.txt для содержания SomeOtherProperty приводит к следующему:

ChoosePropertyFromItem:
  LastLine='2'
person Brian Kretzler    schedule 23.03.2011

Вы не можете создавать новые свойства таким образом. Вы не можете создавать имена свойств динамически. Вы можете изменить процесс сборки. Пример

 msbuild.exe yourproject.sln /p:UseSomeProp=true
person Sergio Rykov    schedule 23.03.2011