2009-12-24 35 views
2

運行MSBuild時,可以從主腳本中調用的每個MSBuild腳本(通過MSBuild任務)訪問通過命令行傳入的任何使用/p:MyProp=value的內容。如何在任務中定義可以從每個腳本進行類似訪問的屬性?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 

這是可能的,如果是這樣,怎麼樣?

我見過的建議使用環境變量,但似乎當變量在腳本設置情況,即,幫助是,和孩子腳本使用調用執行任務(否則env.variable更改不起作用)。

+0

btw環境變量在調用VCBuild任務時也會生效,而不僅僅是Exec任務 – stijn 2009-12-25 11:40:17

回答

6

由於您使用的是MSBuild任務,您必須使用Properties屬性將所需屬性傳遞給調用,因此您應該將示例更改爲。

<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中。 – 2009-12-25 13:40:12

+2

而不是使用MSBuild任務使用該腳本,那麼你應該修改你的過程只是導入文件。這提供了一個非常緊湊的集成。 – 2009-12-25 13:56:04

+0

完美 - 導入腳本是目前實際工作的唯一方法。如果您在答案中提到了這一點,我會將其標記爲已接受。 – 2009-12-26 10:19:34

5

您可以使用rsp文件來定義全局屬性。這些屬性對於子項目是可見的。

+0

我看不到我的「子腳本」('Script2.proj')如何改變它們。是否有可能使用.rsp文件來完成我在問題中描述的內容? – 2012-11-07 23:35:08