2010-06-03 2 views
3

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

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

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

Target 2, где он читает в значении текстового файла и устанавливает его в собственность и устанавливает переменную «OutputVar», чтобы соответствовать. Предполагается, что это будет возвращено родителям.

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

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

ответ

4

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

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

(Более подробную информацию о MSBuild task).

5

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

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

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

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

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

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

+1

+1 для разработки. –

Смежные вопросы