MSBuild 2015发布:无法找到有效的AspnetMergePath

时间:2016-05-03 13:42:29

标签: c# msbuild visual-studio-2015 teamcity

我在TeamCity上构建了一个Web项目,可以为以后的部署打包,目前正在使用MSBuild 2013.当我最近推送一些代码时,我遇到了构建错误(因为我使用了一些C#6功能)所以我去改变构建配置以使用MSBuild 2015而得到了这个错误:

docker run -v /user-service/code:/code tools other_command.py

之前在其他问题中已经提到过此错误(例如:VS 2012 Publish: Can't find the valid AspnetMergePath),但不幸的是,这些问题中提到的修复都没有对我有用。

我已经尝试或已经是这样的事情:

  • 本地计算机上的Web和WebApplication目录(位于C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0)已被复制到构建服务器(它们一直在那里)
  • [Error] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Transform\Microsoft.Web.Publishing.AspNetCompileMerge.targets(132, 5): Can't find the valid AspnetMergePath <TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\</TargetFrameworkSDKToolsDirectory>档案
  • Microsoft.Web.Publishing.AspNetCompileMerge.targets添加到MSBuild命令

我对这一点感到有些失落:我尝试的唯一一件事就是在构建服务器上安装Visual Studio,但我真的很想避免这样做如果可以的话(因为我觉得你应该在CI服务器上安装一个完整的IDE是荒谬的!)。

进一步的信息:

  • 如果将构建切换回MSBuild 2013,一切都会继续正常工作(尽管很明显,我们不想在过去陷入困境)
  • 我们有许多其他纯编译版本,它们针对MSBuild 2015运行而没有错误

2 个答案:

答案 0 :(得分:6)

最初在VS 2012 Publish: Can't find the valid AspnetMergePath上提出的第二个和第三个解决方案实际上都有效,但必须提供正确版本的SDK工具

原始文章(VS 2012 Publish: Can't find the valid AspnetMergePath)是在2013年编写的,涵盖了Visual Studio 2012.支持C#6.0和.NET 4.6的 aspnet_merge.exe 不是找到的那篇在路径RemoteJob下。

为了使第三个解决方案有效,请使用以下路径"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\"

或者说, "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\" 添加到MSBuild命令可以解决问题

我的团队与您描述的问题完全相同,并将此参数添加到MSBuild步骤,立即修复它。 (我当然假设您的构建计算机上有NETFX 4.6版本的工具。)

作为旁注,由于您说您使用Team City - 而不是直接将上述参数添加为命令行参数,您可以使用建议的团队城市和configure the corresponding build parameter

答案 1 :(得分:1)

接受的答案只是症状治疗,并没有解决潜在的问题。请使用diagnostic logging运行MSBuild。如果您查看Microsoft.Web.Publishing.AspNetCompileMerge.targets,您会看到它尝试将TargetFrameworkSDKToolsDirectoryAspnetMergeName连接起来。如果您在MSBuild日志中搜索,您会发现TargetFrameworkSDKToolsDirectory为空。 TargetFrameworkSDKToolsDirectory是从TargetFrameworkSDKDirectory构建的,也是空的。

这就是你需要解决的问题。就我而言:

  • 安装Windows 7.1 SDK(在Windows Server 2016上使用this workaround)。
  • 在VS2017中,路径是根据我/configuration/msbuildToolsets/toolset/property[@name="FrameworkSDKRoot]中的Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.6.1@InstallationFolder确定的。在我的情况下,此节点仅在WOW6432Node中可用,它也需要在64位注册表中可用。您需要将节点复制到64位注册表中的等效位置。