2010-05-20 23 views
1

我有一個包含下列項目.NET解決方案:環境變量迷路之間的MSBuild項目

  • Web應用程序(WAP)
  • Web部署(WDP,.wdproj)
  • 威克斯設置(WIX, .wixproj)

在WDP中,我使用了一個自定義的MSBuild任務(SetEnvVar)來設置一些env。變量在構建過程中進一步使用。設置它們之後,我可以毫無疑問地使用它們。 在WDP中,但在WIX中它們是空的/未定義的。奇怪的是,當我參考那些環境。 VIX文件中的變量(使用.wxs中的屬性或.wxi中的預處理變量)我按照預期得到值。

你有什麼想法爲什麼env。變量會丟失/未在.wixproj中定義?

由(解決方案)構建過程是從內部更新VS 2010

觸發方式

這基本上是我的任務代碼:

Environment.SetEnvironmentVariable(this.Variable, this.Value); 

是一個MSBuild的解決方案生成不是一個過程?

MSBuild是否會爲解決方案中的每個項目生成一個新進程?

+0

當然如果有問題的答案會很好!我希望WiX不在一個單獨的過程中運行,因爲我希望和DotNetter完全一樣。 :) – Dave 2013-04-17 06:07:14

回答

1

是否有可能你的SetEnvVar任務設置單個進程而不是全局環境變量(它應該做的是安全的順便說一句)?在這種情況下,WIX thingie很可能以某種方式作爲一個不同的進程啓動,因此它擁有當前全局環境集的私有副本。

+0

「全局」你可能意味着使用第二個SetEnvironmentVariable()重載並將第三個參數(目標)設置爲用戶/機器? 其實我不想env。變量要堅持在註冊表中,我只需要在整個MSBuild解決方案構建過程中使用它們。 – DotNetter 2010-05-21 08:40:06

+0

第三個參數可以在全局範圍內設置,但最好不要這樣做,因爲它會影響整個系統。 你可以使用詳細信息運行你的構建?我真的懷疑構建的一部分是作爲不繼承環境的另一個過程而產生的。通過顯示診斷信息,您可以找出發生的情況,也可以找到一種方式來傳遞環境。 – stijn 2010-05-21 08:50:59

+0

Thx的提示,我會嘗試。 – DotNetter 2010-05-21 09:04:31

0

以下是項目文件的顯著部分:

WDP(.wdproj)

<Target Name="AfterBuild"> 
    <SetEnvVar Variable="MAJOR" Value="$(MajorNumber)" /> 
    <SetEnvVar Variable="MINOR" Value="$(MinorNumber)" /> 
    <SetEnvVar Variable="REVISION" Value="$(RevisionNumber)" /> 
    <SetEnvVar Variable="BUILD" Value="$(BuildNumber)" />   
</Target> 

維克斯(.wixproj)

<Target Name="AfterBuild"> 
    <Message Text="Major: $(MAJOR) Minor: $(MINOR) Revision: $(REVISION)" /> 
    <Move SourceFiles=".\bin\$(Configuration)\$(OutputName).msi" DestinationFiles=".\bin\$(Configuration)\Product_$(MAJOR).$(MINOR).$(REVISION).msi" />   
</Target> 

消息任務日誌輸出爲「Major:Minor:Revision:」 the refore MAJOR,MINOR和REVISION變量不適用於WIX項目,因此MSI軟件包名稱爲Product _... msi

項目構建順序當然是WAP - > WDP - > WIX。

+0

看起來不錯;唯一我能想到的是,VisualStudio爲每個項目文件產生了1個msbuild進程。你能檢查這個,比如在任務管理器中嗎? – stijn 2010-05-24 10:35:24