visual studio 2010 - Visual Studio 2012解決方案的TeamCity中的MSBuild




visual-studio-2010 visual-studio (4)

我有一個VS 2012 web項目/ sln,我正在嘗試在TeamCity中構建。 它使用安裝在TeamCity上的.NET 4.5。

TeamCity服務器僅安裝了VS 2010

運行構建時出現此錯誤:

C:\BuildAgent\work\d5bc4e1b8005d077\CUSAAdmin.Web\CUSAAdmin.Web.csproj(799, 3): 
error MSB4019: 
The imported project 
    "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets" was not found. 
 Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. Project CUSAAdmin.Web\CUSAAdmin.Web.csproj failed. 
 Project CUSAAdmin.sln failed. 

它試圖使用Visual Studio 2012(v11.0)來構建。

我已經在build.xml中將VisualStudioVersion設置為10 ,但是?

 <Target Name="BuildPackage">
   <MSBuild Projects="CUSAAdmin.sln" ContinueOnError="false" 
     Targets="Rebuild" 
      Properties="Configuration=$(Configuration); VisualStudioVersion=10.0"  />

在項目內部,它默認VS2010

  <PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath 
    Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

如下所述:

  • 安裝nuget MSBuild.Microsoft.VisualStudio.Web.targets
  • 編輯.csproj文件

更換:

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> 
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />

有:

<Import Project="..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" Condition="true" />

很明顯,你必須確保版本與安裝的nuget和<Import>路徑相匹配


實際上,您不需要在CI服務器上安裝Visual Studio。 您只需將幾個文件夾從開發機器複製到CI服務器上的相同位置即可。

VS 2015:

  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ Web
  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ WebApplications

VS 2013:

  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ Web
  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ WebApplications

VS 2012:

  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web
  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ WebApplications

VS 2010:

  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web
  • C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ WebApplications

.NET 4.6:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.6

.NET 4.5.2:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5.2

.NET 4.5.1:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5.1

.NET 4.5:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5

.NET 4.0.1:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0.1

.NET 4.0:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0

或者,正如Matt所建議的那樣 ,您可以將它們複製到項目的子目錄中,並更改MSBuild中的<MSBuildExtensionsPath32>位置(通常為.csproj.vbproj )文件。

一旦你完成了這個項目,你的項目就會被編譯。 您仍然應該將VisualStudioVersion明確設置為您正在使用的VisualStudioVersion,以確保其設置正確。

注意:此解決方案適用於所有項目類型(包括Web項目)。 對於一個網站(沒有項目文件),我最終安裝了與我正在使用的.NET SDK版本匹配的Windows SDK ,因為缺少導致它無法構建的註冊表項。


或者,您可以將所需的構建目標從c:\ Program Files(x86)\ MSBuild複製到項目的子目錄(例如。\ Build),確保保留結構並將以下內容添加到您的csproj中:

<!-- redirect msbuild path so targets can be added to source control -->
<PropertyGroup>
  <MSBuildExtensionsPath32>..\Build\</MSBuildExtensionsPath32>
</PropertyGroup>

例如,如果我的項目根目錄是C:\ Dev \ MyProjSln \ MyProj

  • 創建文件夾C:\ Dev \ MyProjSln \ Build \ Microsoft \ VisualStudio \ version \ WebApplications \
  • 將C:\ Program Files文件(x86)\ MSBuild \ Microsoft \ VisualStudio \ version> \ WebApplications \的內容複製到創建的文件夾
  • 在csproj的Project節點下的Property Group中添加MSBuildExtensionsPath32元素
  • 利潤!

就個人而言,我更喜歡這種跟踪構建目標依賴關係的方法,因為它可以防止構建服務器依賴於具有未記錄的文件夾結構需求,並將您的依賴關係存入源代碼控制


結果很簡單。 為了讓MSBuild運行VS2010作為TeamCity中由VS2012製作的解決方案的構建器,只需為此構建配置設置環境變量即可:

Name: env.VisualStudioVersion 
Value: 10.0

注意TeamCity不需要安裝VS2012。





teamcity