2010-04-15 37 views
14

我對MSBuild相當陌生,並且我已經在一個Wpf項目文件上做了一些自定義工作,我正在VS2010和TFS2010中構建它們。

<OutputPath Condition=" '$(TeamBuildOutDir)' == '' ">$(SolutionDir)build\binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath> 
<OutputPath Condition=" '$(TeamBuildOutDir)' != '' ">$(TeamBuildOutDir)binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath> 

這樣我就可以在桌面上建立的時候建立一個集中的二進制文件目錄,並允許TFS找到二進制文件時,CI構建運行:我如下定製的輸出路徑。

但是,似乎在這兩種情況下,$(ProjectDir)屬性在構建時計算爲「',這會產生奇怪的結果。做一些調試,看起來好像$(ProjectName)是在BeforeBuild執行時設置的,但是我的OutputPath屬性在該點之前正在評估它。

<ProjectNameUsedTooEarly Condition=" '$(ProjectName)' == '' ">true</ProjectNameUsedTooEarly> 

上述屬性與我的OutputPath屬性位於相同的屬性組中。在BeforeBuild目標中,$(ProjectNameUsedTooEarly)的計算結果爲true,但$(ProjectName)按照正常情況評估項目名稱。

我能做些什麼來確保$(ProjectName)在我使用它時有一個值?我只是使用Attrice的MSBuild Sidekick來調試通過我的構建文件,並在第一個可用於斷點(_CheckForInvalidConfigurationAndPlatform)的目標,所有的屬性似乎已經設置好了。 ProjectName已正確設置,但我的OutputPath屬性已使用ProjectName的空白值設置。

回答

24

嗯 - 混亂位那兒的情況,我會盡力理清

  1. 不要使用$(PROJECTDIR) - 使用$(MSBuildProjectDir) - 這是在您的csproj的位置源代碼樹並由MSBuild.exe設置爲保留屬性。我認爲直到Microsoft.Common.Targets被導入之後(這由Microsoft.Csharp.targets完成),$(ProjectDir)纔可用。財產評估始終在文件中「就地」進行,而不是在所有進口完成時進行。這也許可以解釋爲什麼你看到在Sidekick的工具屬性爲有效

  2. 同樣使用$(MSBuildProjectName)(我認爲這將解決你的問題)

  3. 我不確定VS2010和TFS2010(如它使用MSBuild 4.0,毫無疑問是一個新的TeamBuild),但在2008年,在.csproj中很難確定是從命令行/ IDE構建還是從TeamBuild內部調用構建。我想說的是我不認爲$(TeamBuildOutDir)在你的csproj中可用。我通常測試$(TeamBuildConstants)屬性,因爲該屬性當teambuild調用您的proj文件時傳遞。 YMMV,因爲我還沒有玩過2010年..

+0

是啊,你是對的 - ProjectDir設置(直接從MSBuildProjectDir,實際上)在Microsoft.Common.Targets。我在調查這件事時發現了很多。我想我自己的困惑源於這樣一個事實,即我還不瞭解common.targets,csharp.targets,問題中的csproj文件的順序等。 2.我從預生成宏頁面中獲取了ProjectName項目的屬性頁面 - 我需要調查MSBuildProjectName是否可用於團隊構建。 MSBuildProjectName來自哪裏?任何想法如何提供? – bwerks 2010-04-16 15:36:58

+1

3.顯然,篡改和無效的IsDesktopBuild已被$(BuildingInsideVisualStudio)取代,但我只假設這已經看到了我的構建日誌中的屬性。至於TeamBuildOutDir,你是對的 - 它不是在一個普通的VS版本中設置的,所以你的反應只是基於它的存在。我實際上從http://blogs.msdn.com/aaronhallberg/archive/2007/06/07/preserving-output-directory-structures-in-orcas-team-build.aspx得到了這個想法。 – bwerks 2010-04-16 15:37:24

+3

+1:我只是花了整個下午的時間在'$(ProjectName)'上敲打我的腦袋,還沒有設置好。這會教會我不要先檢查Stack Overflow ... – 2010-08-09 20:39:18