在 Visual Web Developer 发布时找不到有效的 AspnetMergePath?

26

我想使用Visual Web Developer Express 2010发布一个网站,通过以下设置预编译到远程服务器上:

  • 只部署运行此应用程序所需的文件
  • 在发布之前预编译此应用程序
  • 允许网站可更新
  • 不会部署任何数据库
  • 将站点部署为文件层次结构,而不是.zip包

我的第一次构建/部署似乎进行得很顺利,但在第二次编译后,我收到以下错误信息:

Transformed web.config using C:\path_to_site\Web.Debug.config into obj\Debug\TransformWebConfig\transformed\web.config.
Copying all files to temporary location below for package/publish:
obj\Debug\AspnetCompileMerge\Source.
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.5\Web\Transform\Microsoft.Web.Publishing.AspNetCompileMerge.targets(132,5): Error : Can't find the valid AspnetMergePath

这里是 Microsoft.Web.Publishing.AspNetConfigurationMerge.targets 文件内容的子集:
  <Target
      Name="GetAspNetMergePath"
      DependsOnTargets="$(GetAspNetMergePathDependsOn)"
      Condition ="'$(GetAspNetMergePath)' != 'false'">
    <PropertyGroup>
      <AspnetMergeName>aspnet_merge.exe</AspnetMergeName>
      <AspnetMergePath Condition="Exists('$(TargetFrameworkSDKToolsDirectory)$(AspnetMergeName)')">$(TargetFrameworkSDKToolsDirectory)</AspnetMergePath>
    </PropertyGroup>
    <Error Condition="'$(AspnetMergePath)' == '' Or !Exists($(AspnetMergePath))"
           Text="Can't find the valid AspnetMergePath" />
  </Target>

编辑:更改发布设置以在发布之前删除所有现有文件并不能解决问题。我目前认为这个问题是本地的。

我的web.config中似乎没有AspMergePath标签。我不知道是否应该手动添加标签。但是,路径“obj {publish setting} \ AspnetCompileMerge \ Source”确实存在于我的项目中。

如果有必要的话,我的项目名称是“TestProject.NET”。

感谢您的反馈。


你尝试过使用“文件系统”方法发布你的网站吗?只是为了测试。 - BrOSs
是的。"文件系统"发布方法遇到了相同的问题。 - user1630889
你不应该添加任何标签('AspMergePath'),另一个测试。使用Ctrl + Shift + W运行了吗? - BrOSs
是的。使用ctrl + shift + W,该网站可以正常运行。 - user1630889
7个回答

15
我遇到了同样的问题。在所有微软相关网站上搜索,发现有很多投诉,但微软没有意愿修复它。
以下是我在我的系统上解决它的方法。编辑Microsoft.Web.Publishing.AspNetConfigurationMerge.targets文件并添加以下行。请确保您的PC上的Microsoft SDK路径与此相同,如果不同,请更改它:
<TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\</TargetFrameworkSDKToolsDirectory>

以下是它应该如何看起来:

  <Target
  Name="GetAspNetMergePath"
  DependsOnTargets="$(GetAspNetMergePathDependsOn)"
  Condition ="'$(GetAspNetMergePath)' != 'false'">
<PropertyGroup>
  <TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\</TargetFrameworkSDKToolsDirectory>
  <AspnetMergeName>aspnet_merge.exe</AspnetMergeName>
  <AspnetMergePath Condition="Exists('$(TargetFrameworkSDKToolsDirectory)$(AspnetMergeName)')">$(TargetFrameworkSDKToolsDirectory)</AspnetMergePath>
</PropertyGroup>
<Error Condition="'$(AspnetMergePath)' == '' Or !Exists($(AspnetMergePath))"
       Text="Can't find the valid AspnetMergePath" />


我遇到了同样的问题,这个解决方案对我很有效。尽管我更喜欢 @tspauld 提出的“更简洁”的解决方案,但不幸的是,在我的情况下,我没能让它起作用。 - pierroz
这个解决方法对我也有用,但我不知道为什么我的.targets文件中完全没有<TargetFrameworkSDKToolsDirectory>行。 - Lews Therin
这也是我的解决方案。对于.NET 4.6.2,应该是:<TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\</TargetFrameworkSDKToolsDirectory>。注意:不要漏掉 TargetFrameworkSDKToolsDirectory 路径末尾的反斜杠。否则 AspnetMergePath 将无法正确合并。 - Henry.K

13
您需要的是aspnet_merge.exe,这是Windows SDK的一部分。它旨在预编译网站,因此您可以关闭预编译,或安装适当版本的Windows SDK。参考来源为维基百科,因为它提供了下载页面的良好链接。您不需要下载/安装所有内容(它很大),只需下载Web安装程序并选择.NET工具,大约需要50兆字节。
请注意,随Visual Studio 2010捆绑的Windows SDK ver. 7.0A无法单独下载,因此您必须在构建服务器上安装Visual Studio,或根据“运行MSBuild失败读取SDKToolsPath”中的答案进行调整。

谢谢您提供的信息!不幸的是,由于我已经转到其他项目,无法验证这个答案的正确性。 - user1630889
正确的答案。现在仍然适用。您需要在构建服务器上安装2015 MSBuild工具和Windows 10 SDK。 - MoonStom

13
这里提供了一种解决方案,不需要更改目标文件。从http://connect.microsoft.com/VisualStudio/feedback/details/786492/publish-cant-find-the-valid-aspnetmergepath中的解决方法建议向msbuild传递附加属性。我使用以下内容使其正常工作:

msbuild website.publishproj /p:DeployOnBuild=true /p:PublishProfile=Release /p:VisualStudioVersion=12.0 /p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\"

关键在于AspnetMergePath属性,如果Windows SDK安装在不同的位置,则需要更改该属性。如果包含来自解决方法的GetAspNetMergePath属性,则会失败,但根据SDK版本可能需要该属性。


啊..没成功.. Win8系统,安装了VS 2012和2013,可能是什么路径问题:( - manishKungwani
我注意到你也传递了VisualStudioVersion=12.0...你不会正在尝试在TFS 2012构建服务器上使用VS 2013进行构建,是吗? - bwerks
4
只有在去掉路径末尾的反斜杠后才能让这个方法对我起作用。例如,将路径修改为/p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools" - Pete
1
Windows 10 更新 - /p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 工具" - Aaron Sherman

4

在所有这些东西 [包括安装 SDK 等] 的解决方法中,有一个方法是禁用发布时预编译选项,这需要 AspNetMerge 存在,即使您没有指定要将内容合并到最终输出中

我费了很大的劲才弄清楚如何关闭它,查看了选项对话框并阅读了友好手册,确认我已经关闭了很长时间,只是意识到复选框在外面:

输入图片说明

取消选择会导致以下更改:.pubxml

-    <PrecompileBeforePublish>True</PrecompileBeforePublish>
-    <EnableUpdateable>True</EnableUpdateable>
-    <DebugSymbols>False</DebugSymbols>
-    <WDPMergeOption>DonotMerge</WDPMergeOption>

这对我有用。

NB 但是,以下内容非常重要:在此处涵盖,必须同时存在Web(它将使通过/p:DeployOnBuild发布无效)和WebApplications(它会导致编译器错误)子文件夹,它们都位于%Program Files (x86)%\MSBuild\Microsoft\VisualStudio\v14.0下(假设使用的是Visual Studio 2015工具),才能成功生成发布包。


1
在我的情况下,缺少了

标签。这是在将Visual Studio 2017更新到15.7.5之后发生的。在此之前它一直正常工作。我需要添加

标签。
<TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\</TargetFrameworkSDKToolsDirectory>

这是在Microsoft.Web.Publishing.AspNetCompileMerge.targets文件中的第129行。


1
我遇到了同样的问题。编辑Microsoft.Web.Publishing.AspNetConfigurationMerge.targets文件并添加以下行。确保使用管理员权限运行编辑器。
在我的情况下,正确的版本是Visual Studio VS2013。
x64
<TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\</TargetFrameworkSDKToolsDirectory>

x86

<TargetFrameworkSDKToolsDirectory>C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\</TargetFrameworkSDKToolsDirectory>

它可以工作!我能编译我的项目。


0

更改目标框架...

<compilation debug="true" targetFramework="4.8"/>
<httpRuntime targetFramework="4.8"/>

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