Как переоценить свойство MSBuild - PullRequest
0 голосов
/ 23 марта 2011

Я могу создать свойство MSBuild, которое содержит нерасширенную ссылку на свойство. Вот пример этого:

Текстовый файл property.txt содержит одну строку

$(SomeProperty)

Это может быть обработано с помощью сценария msbuild следующим образом:

</p> <pre><code><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. Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

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

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'
0 голосов
/ 23 марта 2011

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

 msbuild.exe yourproject.sln /p:UseSomeProp=true
...