首页 文章

Visual Studio 2012解决方案TeamCity中的MSBuild

提问于
浏览
71

我有一个VS 2012 web项目/ sln,我正在尝试在TeamCity中构建 . 它使用安装在TeamCity上的.NET 4.5 .

TeamCity服务器具有 VS 2010 installed only .

构建运行时出现此错误:

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>

6 回答

  • 91

    实际上,您不需要在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 suggested,您可以将它们复制到项目的子目录中,并更改MSBuild(通常为 .csproj.vbproj )文件中的 <MSBuildExtensionsPath32> 位置 .

    完成此操作后,您的项目将进行编译 . 您仍应将VisualStudioVersion明确设置为您正在使用的那个,以确保它设置正确 .

    注意:此解决方案适用于所有项目类型(包括Web项目) . 对于一个网站(没有项目文件),我最终安装了与我正在使用的.NET SDK版本匹配的Windows SDK,因为缺少导致它不能构建的注册表项 .

  • 52

    事实证明它非常简单 . 要使MSBuild作为VS2012在TeamCity中构建的解决方案的构建器上运行VS2010,只需为构建配置设置环境变量,如下所示:

    enter image description here

    Name: env.VisualStudioVersion 
    Value: 10.0
    

    Note TeamCity does not need VS2012 installed.

  • -1

    或者,您可以将所需的构建目标从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 \的内容复制到创建的文件夹

    • 将MSBuildExtensionsPath32元素添加到csproj中Project节点下的Property Group

    • 利润!

    就个人而言,我更喜欢这种跟踪构建目标依赖关系的方法,因为它可以防止构建服务器依赖于具有未记录的文件夹结构要求,并将您的依赖项转换为源代码控制

  • 3

    here所述:

    • 安装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> 中的路径

  • 6

    我完全不同意更改项目文件,因为这可能会影响其他开发人员 . 这对我有用,因为MS build文件夹中缺少v11.0文件夹:1)创建v111 .

    • 在C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio上创建v11.0文件夹

    • 从我的开发框中复制Web和WebApplications文件夹"C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0"

    • Booom!工作就像一个魅力\

    • 注意:我安装了"Microsoft Visual Studio 2012 Shell (Isolated) Redistributable Package"

  • 7

    首先,TeamCity不需要构建任何版本的Visual Studio . 使用时配置项目中的构建步骤MSBuild运行者TeamCity需要知道要使用哪个版本的MSBuild . 这是构建步骤的设置 . 必须根据构建计算机上安装的.NET工具在构建步骤配置中选择正确的MSBuild版本 . TeamCity将使用该值来确定位置路径,并在调用MSBuild时设置环境变量 .

    Visual Studio 2012/2013的问题在于它仅支持TeamCity从8.1.0开始 . 因此,如果您的TeamCity版本在8.1之前 . 您需要升级到最新的8.1.x以查看MSBuild Tools 2013的设置 . 一旦在构建步骤设置中选择了正确的MSBuild版本,问题就会消失 . 欲了解更多信息,请阅读:http://blog.turlov.com/2014/07/upgrade-teamcity-to-enable-support-for.html

相关问题