#visual-studio #msbuild
#visual-studio #msbuild
Вопрос:
У меня есть 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
, а скорее печатает его буквальное содержимое. Как я могу это изменить?
Комментарии:
1. msbuild считывает все метаданные параллельно, то есть одновременно, поэтому, если вы хотите перезаписать метаданные другими метаданными, вы должны указать порядок.
2. Привет! Оказывается, что на самом деле это ошибка, связанная с xbuild. Я смог заставить его работать для msbuild с вашим ответом!
3. Рад знать, что это работает для вас. Хорошего дня!
Ответ №1:
MSBuild неправильно оценивает свойство
MSBuild считывает все метаданные параллельно, что означает, что это делается одновременно, поэтому значение первого 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>