MSBuild 2015发布:找不到有效的AspnetMergePath。

9
我在TeamCity上有一个构建项目,用MSBuild 2013打包了一个网站项目,以备后续部署使用。最近我提交了一些代码,由于我使用了一些C#6的特性,导致构建错误。于是我尝试更改构建配置为MSBuild 2015,但出现了以下错误:
[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
此错误在其他问题中也有提到过(例如这里:VS 2012 Publish: Can't find the valid AspnetMergePath),但不幸的是这些问题中提到的解决方法都没有对我起作用。
我已经尝试过或者已经存在的情况如下:
  • 从本地机器的Web和WebApplication目录(位于C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0)复制到构建服务器(它们一直都在那里)
  • 将C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\添加到Microsoft.Web.Publishing.AspNetCompileMerge.targets文件中
  • 将/p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\"添加到MSBuild命令中
我有点茫然:几乎唯一我没有尝试的就是在构建服务器上安装Visual Studio,但如果可能的话(因为我认为在CI服务器上必须安装完整的IDE太荒谬了),我真的想避免这样做。
一些进一步的信息:
  • 如果将构建切换回MSBuild 2013,一切都可以正常工作(虽然显然我们不想被困在过去)
  • 我们还有许多其他纯编译的构建正在使用MSBuild 2015运行,没有错误

@Richiban 你为什么安装了VS2015 :) 解决方案就像这个答案中所说的那样“简单” https://dev59.com/fmcs5IYBdhLWcg3wmlMK#16694597:从开发机器上复制`C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14文件夹到构建服务器,然后编辑Microsoft.Web.Publishing.AspNetConfigurationMerge.targets并添加<TargetFrameworkSDKToolsDirectory>如链接中所示。在我的情况下,我使用了*[...]v8.1A\bin\NETFX 4.5.1 Tools*,但如果您有Windows 10 SDK也可以使用...对于您来说可能已经太晚了,但也许它能帮助其他人。不再需要指定/p:AspnetMergePath` ;) - firepol
@firepol 这可能应该是一个答案,而不是一个评论。 - TylerH
2个回答

9
提出的第二种和第三种解决方案在VS 2012发布:找不到有效的AspnetMergePath上原本都是可行的,但必须提供正确版本的SDK工具。原始文章(VS 2012发布:找不到有效的AspnetMergePath)写于2013年,涵盖了Visual Studio 2012。支持C# 6.0和.NET 4.6的aspnet_merge.exe不是在路径"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命令中添加/p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\"可以解决该问题
我的团队正好遇到了您描述的同样问题,并将此参数添加到MSBuild步骤中立即解决了问题。(当然,我假设您的构建机器上有NETFX 4.6版本的工具。)
顺便说一下,既然您说您使用Team City - 您可以使用Team City推荐并配置相应的构建参数,而不是将上述参数直接添加为命令行参数。

4
我必须添加一个更具体的合并路径才能让它在VS15上工作。我使用了/p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\aspnet_merge.exe",指定实际工具而不仅仅是路径。 - Matthew Proctor
这个命令应该放在哪里?Web 项目 -> 属性 -> 构建事件? - DoomerDGR8
1
@DoomerDGR8 /p:AspnetMergePath 是一个 MSBuild 参数,而不是一个命令。原问题是关于在构建机器上运行 MSBuild 时设置它(意味着将 MSBuild.exe 作为命令行工具执行)。在您的情况下,至少我这样解释您的问题,您想从 Visual Studio 将此参数传递给 MSBuild。VS(2015 及以下版本)不支持在 GUI 中定义 MSBuild 参数。要在 VS 中添加并使用它,您应该直接将其添加到 *.csproj 文件中。这个答案 解释了如何做到这一点(请参见其中的“更新”部分)。 - ironcev

2
所接受的答案只是对症状进行了治疗,没有解决根本问题。请使用 诊断日志记录 运行 MSBuild。如果您查看 Microsoft.Web.Publishing.AspNetCompileMerge.targets,您将会发现它试图将 TargetFrameworkSDKToolsDirectoryAspnetMergeName 进行连接。如果您在 MSBuild 日志中搜索,您会发现 TargetFrameworkSDKToolsDirectory 是空的。 TargetFrameworkSDKToolsDirectory 是从 TargetFrameworkSDKDirectory 构建的,该目录也为空。

这就是您需要解决的问题。在我的情况下:

  • 安装 Windows 7.1 SDK(在 Windows Server 2016 上使用此解决方法)。
  • 在 VS2017 中,路径是基于 /configuration/msbuildToolsets/toolset/property[@name="FrameworkSDKRoot] 决定的,在我的情况下是 Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.6.1@InstallationFolder。在我的情况下,这个节点只在 WOW6432Node 中可用,它还需要在 64 位注册表中可用。你需要将该节点复制到 64 位注册表中的等效位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接