MSBuild 未正确评估 属性

MSBuild does not evaluate property correctly

我有一个 ItemGroup,它定义了几个稍后应该写入文件的值:

<ItemGroup>
    <_SomeValue Include="SomeInclude">
        <_Parameter1>%(PrintMe)</_Parameter1>
    </_SomeValue>
</ItemGroup>

PrintMe 是之前定义的。它的值应该打印在最后。

写入文件的行是这样构建的:

<ItemGroup>
    <_LinesToWrite Include="Some First Line" />
    <_LinesToWrite Include="%(_SomeValue._Parameter1)" />
</ItemGroup>

然后写成:

<WriteLinesToFile File="$(TheFile)" Lines="@(_LinesToWrite)" />

问题是文件末尾不包含 PrintMe 的值,而是文字字符串 %(PrintMe)。 这意味着行 <_LinesToWrite Include="%(_SomeValue._Parameter1)" /> 不会评估 _Parameter1 中的 属性 而是打印其文字内容。我该如何更改?

MSBuild does not evaluate property correctly

MSBuild并行读取each metadata,也就是说是同时完成的,所以第一个 metadata 无法在另一个 metadata 中读取。

因此,如果要在元数据之间赋值,必须指定顺序。比如再放一个读取第一个元数据到一个target中。

注意:%读取的是一个元数据,并且要同时包含项目的名称。

举个例子,

<ItemGroup>
    <FirstValue Include="FirstValue">
      <PrintMe>i am print me</PrintMe>
    </FirstValue>
 </ItemGroup>

要读取 PrintMe 的值,您应该使用 %(FirstValue.PrintMe)

请参考这个,在我这边,它可以打印PrintMe项元数据的值。

<ItemGroup>
        <FirstValue Include="FirstValue">
            <PrintMe>i am print me</PrintMe>
        </FirstValue>
</ItemGroup>
    
  <Target Name="test123" AfterTargets="Build">
      <ItemGroup>
          <_SomeValue Include="SomeInclude">
              <_Parameter1>%(FirstValue.PrintMe)</_Parameter1>
          </_SomeValue>
      </ItemGroup>
      <ItemGroup>
          <_LinesToWrite Include="Some First Line" />
          <_LinesToWrite Include="%(_SomeValue._Parameter1)" />
      </ItemGroup>
        
      <Message Importance="high" Text="%(_SomeValue._Parameter1)">
    </Message>
    <WriteLinesToFile File="test.txt" Lines="@(_LinesToWrite)">
    </WriteLinesToFile>
  </Target>