我有一个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
中的属性,而是打印其文字内容。我该如何更改?
答案 0 :(得分:2)
MSBuild无法正确评估属性
MSBuild 并行读取each metadata ,这意味着它是同时完成的,因此第一个metadata
的值不能为读另一个metadata
。
因此,如果要在元数据之间分配值,则必须指定顺序。例如,放置另一个以将第一个元数据读入目标。
注意:%
读取一个元数据,并且该元数据应与项目名称同时显示。
例如
<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>