2011-03-02 74 views
1

我使用BuildEngine作爲創建單擊構建環境的步驟。代碼如下:MSBuild:在BuildEngine中定義子項目構建配置

Engine engine = new Engine(); 
FileLogger logger = new FileLogger { Parameters = @"logfile=C:\builds\build.log" }; 
engine.RegisterLogger(logger); 

var project = new Project(engine); 
project.Load("Example.csproj"); 
project.SetProperty("Configuration", "Release"); 

bool success = project.Build(); 

而他似乎用發佈配置生成項目示例。但是當我查看build.log時,Example項目的所有依賴關係都被構建爲debug。

有什麼辦法強制它在Release上構建所有的依賴關係嗎?

+0

您確定依賴項目在其csproj文件中沒有「硬編碼」爲「調試」嗎?它應該是這樣的: Debug jishi 2011-03-02 15:55:25

+0

那麼,如果事實上它們是=)但是AFAIK那行只會告訴編譯器使用Debug配置如果$(配置)沒有設置。那麼,有沒有辦法設置$(Configuration)變量還是應該將默認設置爲Release? – dcarneiro 2011-03-02 16:05:29

回答

1

設置在發動機上的全局屬性:

BuildPropertyGroup bpg = new BuildPropertyGroup(); 
bpg.SetProperty ("Configuration", "Release"); 
engine.GlobalProperties = bpg; 

這將改寫項目本身設置的屬性。

+0

您只是忘記將屬性視爲字面值:bpg.SetProperty(「Configuration」,configuration,true);儘管如此,它完美的工作! – dcarneiro 2011-03-03 10:18:35

1

Engine類已過時。
改爲使用Microsoft.Build.Evaluation.ProjectCollection。 它使您能夠像從命令行調用msbuild時那樣傳遞全局屬性。

我應該警告你,msbuild吃了很多內存。我有一臺機器作爲服務工作。當它接收到構建它的命令時,將創建新的進程並調用Build()。有時內存使用量達到2GB(我們的構建是巨大的)。當你從命令行調用MSBuild時,它會釋放更有效的內存。

嘗試測試2個實現 - 拋出API並拋出調用MSBuild.exe - 在一個循環中。可能在MSBuild 4.0 MS解決了這些內存問題。

+0

但我的項目是在框架3.5。 ProjectCollection是在該框架上還是僅在框架4中構建項目? – dcarneiro 2011-03-02 17:47:40

+1

您可以使用MSBuild 4.0。它可以用framework 3.5構建你的項目。如果builer與4.0一起工作,遷移到4.0將會更容易。 – 2011-03-02 17:56:35

相關問題