Проблема с выводом переменных MSBuild

Я пытаюсь вывести переменную из одной цели в родительскую цель, которая ее запустила. Например,

Цель 1 просто вызывает задачу в файле 2 и должна иметь возможность использовать установленную в ней переменную. Однако я просто не могу заставить его работать (возможно, неправильный синтаксис?). Цель 1 выглядит так:

<Target Name="RetrieveParameter">
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="ObtainOutput" />
    <Message Text="Output = $(OutputVar)" />
</Target>

Цель 2 — это место, где он считывает значение текстового файла, устанавливает его в свойство и задает соответствие переменной 'OutputVar'. Это должно быть возвращено родителю.

<Target Name="ObtainOutput" Outputs="$(OutputVar)">
    <ReadLinesFromFile File="output.txt">
        <Output TaskParameter="Lines"
                PropertyName="OutputVar" />
    </ReadLinesFromFile>
</Target>

Я новичок в задачах MSBuild, так что это может быть что-то очевидное. Все, что я хочу сделать, это установить переменную в одной задаче, а затем сделать ее доступной в родительской задаче, которая ее вызвала.


person Chris Dobinson    schedule 03.06.2010    source источник


Ответы (2)


Жюльен дал вам правильный ответ, но не объяснил, почему это так правильный.

Поскольку вы новичок в задачах MSBuild, я объясню, почему ответ Жюльена правильный.

Все задачи в MSBuild имеют параметры — вы будете знать их как атрибуты, которые вы присваиваете задаче. Любой из этих параметров можно прочитать, поместив в него элемент Output. Элемент Output имеет три атрибута, которые можно использовать:

  • TaskParameter - это имя атрибута/параметра задачи, которую вы хотите получить
  • ItemName — это группа элементов, в которую нужно поместить значение этого параметра.
  • PropertyName — это имя свойства, в которое нужно поместить это значение параметра.

В ваших исходных сценариях вы вызывали одно из другого. Второй сценарий будет выполняться в другом контексте, поэтому любое свойство или группа элементов, которые он устанавливает, существуют только в этом контексте. Поэтому, когда второй сценарий завершается, если вы не указали некоторые элементы Output для захвата значений, они будут отброшены.

Обратите внимание, что вы можете поместить более одного элемента Output в задачу для захвата нескольких параметров или просто установить одно и то же значение для нескольких свойств/групп элементов.

person daughey    schedule 28.06.2012

Вы должны использовать TargetOutputs задачи MSBuild:

 <Target Name="RetrieveParameter">
   <MSBuild Projects="$(MSBuildProjectFile)" Targets="ObtainOutput">
     <Output TaskParameter="TargetOutputs" ItemName="OutputVar"/>
   </MSBuild>
   <Message Text="Output = @(OutputVar)" />
 </Target>

(Дополнительная информация о задаче MSBuild.)

person Julien Hoarau    schedule 04.06.2010