MSBuild неправильно оценивает свойство

#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>
  
  

введите описание изображения здесь