我對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的空白值設置。
是啊,你是對的 - ProjectDir設置(直接從MSBuildProjectDir,實際上)在Microsoft.Common.Targets。我在調查這件事時發現了很多。我想我自己的困惑源於這樣一個事實,即我還不瞭解common.targets,csharp.targets,問題中的csproj文件的順序等。 2.我從預生成宏頁面中獲取了ProjectName項目的屬性頁面 - 我需要調查MSBuildProjectName是否可用於團隊構建。 MSBuildProjectName來自哪裏?任何想法如何提供? – bwerks 2010-04-16 15:36:58
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
+1:我只是花了整個下午的時間在'$(ProjectName)'上敲打我的腦袋,還沒有設置好。這會教會我不要先檢查Stack Overflow ... – 2010-08-09 20:39:18