【问题标题】:MSBuild 2015 publish: Can't find the valid AspnetMergePathMSBuild 2015 发布:找不到有效的 AspnetMergePath
【发布时间】:2016-05-03 13:42:28
【问题描述】:

我在 TeamCity 上有一个构建,它打包了一个 Web 项目以供以后部署,目前使用 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),但不幸的是,这些问题中提到的修复都没有对我有用。

我已经尝试过或已经尝试过的事情:

  • 本地计算机(位于 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0)的 Web 和 WebApplication 目录已复制到构建服务器(它们一直存在)
  • 已添加 <TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\</TargetFrameworkSDKToolsDirectory>Microsoft.Web.Publishing.AspNetCompileMerge.targets文件
  • 在 MSBuild 命令中添加了/p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\"

我对这个有点不知所措:几乎我唯一没有尝试过的就是在构建服务器上安装 Visual Studio,但如果可以的话,我真的很想避免这种情况(因为我认为必须在 CI 服务器上安装完整的 IDE 是荒谬的!)。

一些进一步的信息:

  • 如果您将构建切换回 MSBuild 2013,一切都会继续正常运行(但显然,我们不想陷入过去)
  • 我们有许多其他纯编译版本在 MSBuild 2015 上运行且没有错误

【问题讨论】:

  • 你解决了吗?
  • 恐怕不行;大约两天后,我只是举手并安装了 Visual Studio :(
  • @Richiban 你为什么要安装 VS2015 :) 解决方案就像这个答案stackoverflow.com/a/16694597/441301 中的“简单”:将C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14 文件夹从开发机器复制到构建服务器,然后编辑@ 987654328@ 并在链接中添加<TargetFrameworkSDKToolsDirectory>。就我而言,我使用了 [...]v8.1A\bin\NETFX 4.5.1 工具,但如果你有 Windows 10 SDK,它也可以工作......对你来说太晚了,但也许它帮助别人。不再需要指定/p:AspnetMergePath ;)

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


【解决方案1】:

最初在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 不在路径"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\"

换句话说,添加 /p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\" 到 MSBuild 命令可以解决问题

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

顺便说一句,既然你说你使用的是Team City——而不是直接将上述参数添加为命令行参数,你可以使用Team City推荐和configure the corresponding build parameter

【讨论】:

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

公认的答案只是对症治疗,并没有解决根本问题。请使用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 位注册表中的等效位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多