Проблема с выводом переменных MSBuild - PullRequest
3 голосов
/ 03 июня 2010

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

Цель 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, поэтому вполне может быть что-то очевидное. Все, что я хочу сделать, это установить переменную в одной задаче, а затем сделать ее доступной в родительской задаче, которая вызвала ее.

Ответы [ 2 ]

5 голосов
/ 29 июня 2012

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

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

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

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

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

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

4 голосов
/ 04 июня 2010

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

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

(Подробнее о MSBuild task ).

...