2013-11-15 149 views
1

我有一個包含大約15個.csproj項目的Visual Studio 2012 C#解決方案。Visual Studio 2012 C#解決方案,並行構建競態條件

每個項目都使用在啓動構建之前生成的通用foo/bar.cs文件。

我嘗試過各種方法:

  • 預生成事件
  • 定製的MSBuild的BeforeBuild目標

單獨創建每個項目工作正常。但是一旦我使用「構建解決方案」,我就面臨一個競爭條件:目標中的一個嘗試編譯foo/bar.cs,而另一個目標正在重新創建目標。

此時,我意識到使用「Build Solution」爲解決方案中的每個項目生成一個MSBuild.exe進程。我認爲,在開始構建項目之前,我會嘗試一勞永逸地創建foo/bar.cs

也許我忽略了一些東西?有沒有一種方法,將實現「建設前的所有產生foo/bar.cs

+0

也許把文件放在一個共同的庫項目中,並讓15個項目引用該庫?這樣你只需要在你的庫項目中包含生成命令。 –

+1

我會做一個項目,其輸出是foo/bar.cs,然後讓其他項目依賴於該項目......或者將其製作成一個庫(因爲它看起來很喜歡你正在嘗試做的語義)。 – IdeaHat

+0

不幸的是這比「把它放在圖書館裏」要複雜一些。另一個只做自定義「構建」目標的項目是誘人的。我將跟進 –

回答

0

由於@MadScienceDreams建議,我創建了一個獨立的項目,其他項目依賴。

我編輯的.csproj文件導入$(MSBuildBinPath)\Microsoft.Common.targets 而不是$(MSBuildBinPath)\Microsoft.CSharp.targets

然後我改寫了Build目標在Exec任務方面。

1

這是解決它的蘇茨基方式。

msbuild myproject.proj /maxcpucount:1 
+0

你不能在IDE中做任何事情,每次你想使用特定的'sln'都不改變全局設置。 –

+2

我說「sucky 」 .......... – granadaCoder

0
before.<SolutionName>.sln.targets 

放置在sln文件旁邊,將在所有csproj之前執行,這在msbuild中工作,但不在Visual Studio中。

相關問題