2009-12-24 5 views
2

При запуске MSBuild все, что передается в командной строке с использованием /p:MyProp=value, доступно из каждого скрипта MSBuild, вызванного (с помощью задачи MSBuild) из основного сценария. Как я могу определить свойство, которое так же доступно из каждого скрипта, в задаче?MSBuild: как создать глобальную собственность?

Например:

Script1.proj: 
[...] 
<Target Name="Test"> 
    <MSBuild Projects="Script2.proj"/> 
    <Message Text="Script1, GlobalProp1=$(GlobalProp1)"/> 
    <Message Text="Script1, GlobalProp2=$(GlobalProp2)"/> 
</Target> 

Script2.proj: 
[...] 
<Target Name="Test"> 
    <!-- ??? Set GlobalProp2 = VALUE2 ??? --> 
    <Message Text="Script2, GlobalProp1=$(GlobalProp1)"/> 
    <Message Text="Script2, GlobalProp2=$(GlobalProp2)"/> 
</Target> 

Если запустить так: msbuild Script1.proj /p:GlobalProp1=VALUE1 вышеуказанные сценарии следующий результат:

Script2, GlobalProp1=VALUE1 
Script2, GlobalProp2= 
Script1, GlobalProp1=VALUE1 
Script1, GlobalProp2= 

я хотел Script2.proj установить GlobalProp2 каким-то образом, чтобы произвести следующий результат:

Script2, GlobalProp1=VALUE1 
Script2, GlobalProp2=VALUE2 
Script1, GlobalProp1=VALUE1 
Script1, GlobalProp2=VALUE2 

Возможно ли это, и если да, то как?

Я видел предложения использовать переменные окружения, но, кажется, что только ситуация, в которой, что помогает, когда переменная устанавливается в родительского сценария и ребенок скрипт вызывается с помощью Exec (в противном случае изменение env.variable не влияет).

+0

переменные окружения btw также вступают в силу при вызове задачи VCBuild, а не только задачи Exec – stijn

ответ

6

Поскольку вы используете задачу MSBuild, вам необходимо передать желаемые свойства в вызов, используя атрибут «Свойства», чтобы вы могли изменить свой пример.

<Target Name="Test"> 
    <MSBuild Projects="Script2.proj" 
     Properties="GlobalProp1=$(GlobalProp1);GlobalProp2=$(GlobalProp2)" 
    /> 
    <Message Text="Script1, GlobalProp1=$(GlobalProp1)"/> 
    <Message Text="Script1, GlobalProp2=$(GlobalProp2)"/> 
</Target> 

Свойства должны быть явно переданы, это по дизайну.

Если вам нужна более строгая интеграция, вместо использования задачи MSBuild следует просто импортировать файлы, которые создадут 1 логический скрипт.

+0

К сожалению, это не работает наоборот - я хочу передать изменения, внесенные в 'Script2', обратно в' Script1'. –

+2

Вместо использования сценария, использующего задачу MSBuild, вы должны изменить свой процесс, чтобы просто импортировать файл. Это обеспечивает очень тиггерную интеграцию. –

+0

Perfect - импортирование скрипта - единственный способ, который действительно работал до сих пор. Я отмечу это как принятое, если вы упомянули об этом в своем ответе. –

5

Вы можете использовать файл rsp для определения глобальных свойств. Эти свойства видны дочерним проектам.

+0

Я не вижу, как мой «подстрочный скрипт» ('Script2.proj') сможет их изменить. Можно ли делать то, что я описываю в вопросе, используя .rsp-файлы? –

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