【问题标题】:How to reevaluate MSBuild property如何重新评估 MSBuild 属性
【发布时间】:2011-03-23 10:54:00
【问题描述】:

我可以创建包含未扩展属性引用的 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 中的属性引用。有可能吗?

【问题讨论】:

    标签: msbuild msbuild-propertygroup


    【解决方案1】:

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

    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
    

    ...与值为 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>
    

    上面是下面主要目标的两个依赖目标。他们使用从属目标来读取文件,以便将其发布到项目组中,以便与 @(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'
    

    【讨论】:

      【解决方案2】:

      您不能以这种方式创建新属性。您不能动态创建属性名称。您可以修改构建过程。示例

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多