如何重新评估MSBuild属性

如何重新评估MSBuild属性,msbuild,msbuild-propertygroup,Msbuild,Msbuild Propertygroup,我可以创建MSBuild属性,该属性包含未展开的属性引用。下面是一个例子: 文本文件property.txt包含一行 $SomeProperty 可以使用以下msbuild脚本对其进行处理: 现在我想展开属性引用,它包含在CurrentLine中。有可能吗?您不能以这种方式创建新属性。无法动态创建属性名称。您可以修改生成过程。范例 msbuild.exe yourproject.sln /p:UseSomeProp=true 如果您事先知道文件中列出的单个属性的所有候选属性,则可以通过项

我可以创建MSBuild属性,该属性包含未展开的属性引用。下面是一个例子:

文本文件property.txt包含一行

$SomeProperty

可以使用以下msbuild脚本对其进行处理:


现在我想展开属性引用,它包含在CurrentLine中。有可能吗?

您不能以这种方式创建新属性。无法动态创建属性名称。您可以修改生成过程。范例

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

如果您事先知道文件中列出的单个属性的所有候选属性,则可以通过项目筛选实现这一点。 注意事项:

1仅指定文件中的PropertyName,而不是$PropertyName,除非要使用property函数解析字符串

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>
…它与值为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>
…请注意,批处理项元数据被传输到这些临时属性,以便使条件生效,这就是文件只能包含一行的原因,因此只有一个项

<Target Name="ChoosePropertyFromItem"
  DependsOnTargets="ReadItems;FilterItems">
  <!-- Standard task for file reading -->
  <PropertyGroup>
    <LastLine>%(_FilteredItems.Value)</LastLine>
  </PropertyGroup>
  <Message Text="LastLine='$(LastLine)'" />
</Target>
将property.txt更改为包含“SomeOtherProperty”将导致以下结果:

ChoosePropertyFromItem:
  LastLine='2'
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>
ChoosePropertyFromItem:
  LastLine='1'
ChoosePropertyFromItem:
  LastLine='2'