2011-01-20 69 views
16

我有一個在VS 2008中構建良好的項目,然後我們安裝並開始使用TFS Build,然後我們升級到TFS 2010 。一切都很好,並且構建正確(在我實現了新的構建過程之後,通過從任何遠程Visual Studio 2010客戶端啓動一次單擊構建即可使所有內容都變得非常好)。 Visual Studio不需要安裝在生成代理上。我很努力(非常難難)不要在Build Agent上安裝Visual Studio,因爲我的理解是沒有必要,我們沒有許可將它安裝在非開發機器上。如何使用TFS Build(VS 2010)創建VS2010 MakeFile項目(vcxproj)

現在我試着升級到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項目運行svcutil等.NET 4.0 SDK工具,但似乎沒有安裝此構建所需的東西。錯誤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(我認爲這是因爲我找不到將sattelite程序集編譯爲獨立解決方案的方法),然後將它們編譯爲DLL(I不記得現在如何工作,但我認爲這是手動運行AL.exe從資源文件編譯DLL文件)。所以基本上我只需要運行命令行來構建這個項目,而我似乎無法找到一個合理的方式來完成這個任務,而不會拋出整個項目並編輯TFS構建腳本來運行一堆硬編碼的命令行代替。有一個更好的方法。

我一直在這一整天,並試圖寫我自己的.targets文件和.xml屬性表來代替標準文件,但它是我的頭。我試圖簡單地刪除這些行,但是MSBuild抱怨沒有「構建」目標。我試圖給vcxproj文件添加一個虛擬文件,但是它似乎沒有運行完成所有工作前的構建前和構建後步驟。

+0

看起來這個問題已經在這裏得到解答:http://stackoverflow.com/questions/3043294/how-to-build-a-vs2010-c-project-on-a-buildserver什麼是正確的方式來更新/刪除這個問題? – BlueMonkMN 2011-01-20 14:20:26

回答

15

Microsoft Windows SDK 7.1有幾個安裝選項。即使沒有包含任何C++代碼(僅包含預構建和後構建步驟),只有「.NET開發」子項「工具」選中後,顯然還不足以構建vcxproj項目。添加「Visual C++編譯器」選項並完全選擇「Intellisense and Reference Assemblies」複選框可以安裝必要的文件和設置。我不確定是否有必要,但是這種組合對我來說確實有效。

2

我已經設計了一個有點複雜,但功能齊全的工作,涉及以下步驟。

  1. 複製在C這些文件:\ Program Files文件,其中VS2010安裝在系統上(X86)\的MSBuild \ Microsoft.Cpp \ V4.0 - 檢查他們到源代碼控制,它們是作爲部分檢索工作區:
    • Microsoft.Build.CPPTasks.Common.dll
    • Microsoft.BuildSteps.targets
    • Microsoft.Cl.Common。道具
    • Microsoft.Cpp.Default.props
    • Microsoft.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
  2. 更改vcxproj文件是指在工作區中把這些文件,而不是$的相對路徑(VCTargetsPath)。
  3. 更改行(在所有這些文件中)使用屬性AssemblyFile =「Microsoft.Build.CPPTasks.Common.dll」,而不是使用AsssemblyName屬性引用此屬性。
  4. 刪除新位置根目錄文件中的「$(VCTargetsPath)\」,以便它找到它的兄弟文件而不是試圖引用不存在的VCTargetsPath宏。您可以通過嘗試在沒有VS 2010的計算機上運行帶有MSBuild的命令行版本並查看錯誤消息來找到您錯過的實例。
  5. 同樣用相對路徑替換子目錄文件中的$(VCTargetsPath)。
  6. 在文件Microsoft.Cpp.Win32.targets的末尾,註釋掉「< VCMessage Code =」MSB8008「.../>」行和以下相關的<導入>。
  7. 試錯,運行命令行編譯,看看還有什麼我可能已經忘記提及。我認爲這是最重要的。
1

一種以改進的BlueMonkMN替代方法是添加

<PropertyGroup> 
    <VCTargetsPath Condition="'$(VCTargetsPath)' == ''">[path_to_the_fileset_listed]</VCTargetsPath> 
</PropertyGroup> 

作爲級別1子附近的vcxproj的頂部。

該路徑可能包含一個環境變量或其他一些衆所周知的包含變量的路徑。

這會減少入侵併且比改變很多行更容易恢復。

+1

您是否還需要在計算機上的某個位置安裝這些Microsoft *文件? – BlueMonkMN 2011-08-20 13:06:26

0

一個甚至與添加的環境變量用於VCTargetsPath更簡單的方法:

  1. 找到由BlueMonkMN
    • 提到的CPP MSBUILD文件夾例如C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120
  2. 打開Windows環境變量
    • Control Panel > System > Advanced Settings > Advanced > Environment Variables
  3. 添加一個新的用戶變量有:
    • 名稱:VCTargetsPath
    • 值:從步驟[您路徑的MSBuild目標1 ]
  4. 重新啓動Visual Studio。
  5. 完成。你的項目現在應該建立。
相關問題