如何使用 TFS Build 建構 VS2010 MakeFile 項目 (vcxproj)(無 VS 2010)
我有一個在 VS 2008 中建構良好的項目,然後我們安裝並開始使用 TFS Build,然後我們升級到 TFS 2010。一切仍然很好並且建構正確(在我實施了讓一切變得非常好的新建構過程之後從任何遠端 Visual Studio 2010 客戶端點擊建構啟動)。Visual Studio 不需要安裝在 Build Agent 上。我正在非常努力(非常努力)不要在 Build Agent 上安裝 Visual Studio,因為我的理解是這不是必需的,而且我們沒有獲得在非開發機器上安裝它的許可。
現在我嘗試將解決方案升級到 VS 2010,仍然針對 .NET 3.5,因為它是針對 SQL Server CLR 過程的程序集,而 SQL Server 還不支持 .NET 4.0。但我根本無法在 TFS Build 下再建構它。我似乎無法從 TFS Build 和 MS Build 命令行獲得一致的錯誤消息,但我認為這與 Microsoft.Cpp.Targets 不在 C:\Program Files\MSBuild\ 中有關,因為我沒有’未安裝 Visual Studio。我確實安裝了 Microsoft Windows SDK 7.1,以便可以為其他一些 .NET 4.0 項目執行 .NET 4.0 SDK 工具(如 svcutil),但似乎沒有安裝此建構所需的東西。TFS 建構給我的錯誤是:
C:\TFSBld[…]\GenerateLanguage\GenerateLanguage.vcxproj(46,3):錯誤 MSB4019:未找到導入的項目“C:\Microsoft.Cpp.Default.props”。確認聲明中的路徑正確,並且該文件存在於磁碟上。
當我點擊該錯誤時,它會將我帶到 vcxproj 文件中的這一行:
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />在這個項目中我真正需要做的就是執行 resgen 以從 resx 文件生成資源文件,並將它們編譯成衛星程序集。我正在使用 makefile 建構來執行此操作,手動執行 resgen(我認為這是因為我找不到任何其他方式將衛星程序集編譯為獨立解決方案的方法),然後將它們編譯成 DLL(我現在不記得它是如何工作的,但我認為它是手動執行 AL.exe 來從資源文件編譯 DLL 文件)。所以基本上我只需要執行命令行來建構這個項目,而我似乎找不到一個合理的方法來完成它而不扔掉整個項目並編輯TFS建構腳本來執行一堆硬編碼的命令行反而。一定有更好的方法。
我一整天都在做這件事,並嘗試編寫自己的 .targets 文件和 .xml 屬性表來代替標准文件,但這超出了我的想像。我嘗試簡單地刪除這些行,但隨後 MSBuild 抱怨沒有“建構”目標。我嘗試向 vcxproj 文件添加一個虛擬對象,但它似乎沒有執行所有工作完成的建構前和建構後步驟。
Microsoft Windows SDK 7.1 有幾個安裝選項。僅檢查“.NET 開發”子“工具”顯然不足以建構 vcxproj 項目,即使它們不包含任何 C++ 程式碼(僅建構前和建構後步驟)。添加“Visual C++ 編譯器”選項並完全選中“智能感知和參考程序集”複選框會安裝必要的文件和設置。我不確定兩者是否都是必要的,但這種組合確實對我有用。
我設計了一個有點複雜但功能性的工作,涉及以下步驟。
- 從安裝了 VS2010 的系統上的 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0 複製這些文件 - 將它們檢入原始碼管理,以便將它們作為工作區的一部分進行檢索:
- Microsoft.Build.CPPTasks.Common.dll
- Microsoft.BuildSteps.targets
- Microsoft.Cl.Common.props
- Microsoft.Cpp.Default.props
- 微軟.Cpp.props
- Microsoft.Cpp.targets
- Microsoft.CppBuild.targets
- Microsoft.CppCommon.targets
- Microsoft.Link.Common.props
- Microsoft.MakeFile.targets
- 平台\Win32\Microsoft.Cpp.Win32.default.props
- 平台\Win32\Microsoft.Cpp.Win32.props
- Platfotms\Win32\Microsoft.Cpp.Win32.targets
- 更改 vcxproj 文件以引用工作區放置這些文件的相對路徑,而不是 $(VCTargetsPath)。
- 更改行(在所有這些文件中)以使用屬性 AssemblyFile=“Microsoft.Build.CPPTasks.Common.dll” 而不是使用 AsssemblyName 屬性來引用它。
- 刪除新位置根目錄中的文件中的“$(VCTargetsPath)\”,以便它找到其兄弟文件,而不是嘗試引用不存在的 VCTargetsPath 宏。您可以通過嘗試在沒有 VS 2010 的機器上使用 MSBuild 執行命令行建構並查看錯誤消息來找到您錯過的實例。
- 同樣,將子目錄文件中的 $(VCTargetsPath) 替換為相對路徑。
- 在文件 Microsoft.Cpp.Win32.targets 的末尾,註釋掉“<VCMessage Code=“MSB8008” … />” 行和以下相關的 <Import>。
- 反複試驗,執行命令行建構,看看我可能忘記提及的其他內容。我想那是大部分。