VS2012 & 2013:无法发布服务项目 - 指定路径太长

Posted

技术标签:

【中文标题】VS2012 & 2013:无法发布服务项目 - 指定路径太长【英文标题】:VS2012 & 2013: Can't publish Services project - specified path is too long 【发布时间】:2014-03-17 10:01:21 【问题描述】:

我有一个 VS2012 解决方案,包含 10 个项目,但突然间,我无法再将我的 Services 项目发布到任何文件夹。

当我尝试发布到 D:\temp 时,我收到此错误:

The expression "[System.IO.Path]::GetFullPath(obj\Release%25252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252528Prod%25252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252529\)" cannot be evaluated. The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets

嗯?

VS2012(更新 4)似乎使用了我的配置名称“Release(Prod)”并将其完全搞砸了,导致 GetFullPath 生成的路径名太长。

我该如何解决这个问题?

出于绝望,我尝试在 VS2013 中构建和发布相同的项目 - 它有相同的错误消息。

我的一位同事说他看到了同样的事情,但通过从他的配置名称中删除空格来修复它。我试过这个,这就是为什么我的配置名称现在是“Release(Prod)”而不是“Release (Prod)”,但它没有任何区别。

我也打开了这个错误提示的文件是错误的原因: C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets

..并注意到其中有一些关于 AnyCPU 平台名称的内容。我尝试让我的服务项目使用“AnyCPU”和“Any CPU”(郁闷的叹息),但似乎都没有任何区别。

  <PropertyGroup Condition=" '$(IntermediateOutputPath)' == '' ">
    <IntermediateOutputPath Condition=" '$(PlatformName)' == 'AnyCPU' Or '$(PlatformName)' == ''">$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
    . . .
  </PropertyGroup>

有其他人看到这个问题吗?

(稍晚一点..)

这太奇怪了(而且令人沮丧)。

我的解决方案有 5 种配置 - 默认的调试和发布配置,以及用于测试、预生产和生产环境的额外配置。

如果我选择这三个包含括号的配置中的任何一个,我会收到这个荒谬的“指定路径太长”错误,因为 VS2012 损坏了路径名(如我上面的第一个屏幕截图所示)。

我不禁想知道...这是某种 VS2012 错误,在配置名称中处理空格或括号?

【问题讨论】:

【参考方案1】:

当发布到文件系统时,我可以在 Target Location 上的 Connection 选项卡上直接使用 (, (, )) 部署到路径(即不从配置构建路径名称) - 但这不是基于配置定位不同位置的解决方案。

如果您想在配置名称中保留特殊字符,但指定不会导致的部署文件夹路径,则发布此帖子可能会有所帮助:Visual Studio: How to properly build and specify the configurations and platforms for x64 and x86

具体玩一下这里的设置:

在项目属性页面中,选择各种排列 解决方案下拉列表中的调试/发布和 x86/x64。确保 目标处理器设置正确(应该是,但我找到了实例 当他们不是时,可能是因为我以前的尝试)。还, 设置输出目录。这应该没问题而且是自动的 (/bin/x86/Debug 等)。如果没有,请修复。

查看实际情况似乎也很有用:

查看插入的数字:

%25 是一个编码的%%28 是编码的 ( %29 是编码的 )

看路径:

OBJ \推出%252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525 *** *** 28%PROD *** 252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525 29 ***) P>

我认为正在发生的事情:

所以这似乎是一个很好的线索,它们是 URL 或 XML 编码的。似乎正在发生的事情是( 被编码为%28,然后% 被递归编码为%25 - 生成无限%252525252525252525...

一个更有趣的问题实际上是为什么它停止使用此错误从 % 创建 25(两次都停止在 214 个字符处创建 25 个字符,包括 %28 / 29 - 不是一个非常有趣的数字)。

查看您引用的文件C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets - 这些字符串正在为 XML 编码是有道理的。我会说这绝对是一个错误...我没有修复建议。

【讨论】:

【参考方案2】:

好吧,我将接受马修的答案作为“已接受的答案”。 感谢您的帮助。

不过,这是一个非常奇怪的问题,我很惊讶没有其他人在其他地方报告过这个问题。

问题摘要(以防微软感兴趣,或者如果有人在未来几年尝试通过 Google 搜索此问题)

使用配置名称“Release (Prod)”,我可以愉快地构建我的代码,在本地运行它,但是当我尝试将它发布到本地驱动器时,我会收到此消息:

这是一个奇怪的例外,因为 Build 确实 创建了“obj\Release (Prod)”文件夹,没有任何问题。只是 Publish 似乎找错了地方。

按照此线程中给出的建议,今天我尝试使用相同的设置创建一个新配置,但名称中没有空格:“Release(SecondProd)”。看看会发生什么:

有趣的是,尽管出现了这个错误,它确实创建了一个具有此名称的新配置。

无论如何,我重新创建了一个新配置,将其命名为 ReleaseProduction,它运行良好。

当然,我需要为此名称创建新的“web.config”转换,因为当您基于旧配置创建新配置时,它不会自动复制。

最后一个想法(只是为了让事情变得更糟!)

当我发布此请求帮助时,我的解决方案中的服务项目拒绝发布到本地驱动器,但我的网站发布正常。

今天,距我上次尝试发布网站两天后,我发现网站现在产生了相同的 GetFullPath 异常。什么都没变!我们使用TFS,我今天和两天前做了一个文件比较,它们是相同的!

这是 VS2012 和 VS2013 中的一个非常奇怪的错误。

顺便说一句,这个解决方案及其中的项目最初是一个 VS2010 项目。一年多前它们升级到 VS2012,但这个发布问题最近才开始发生。我不确定问题是否与使用升级的 VS 项目有关。

再次感谢您的帮助。

现在我有一些测试、预生产和生产配置要重新创建!

也许我会先喝杯啤酒..

【讨论】:

【参考方案3】:

总结并完成马修的回答:

原因:您的配置包含需要 URI 编码的字符 - 在您的情况下是 '(' 和 ')'。

解决方法:重命名这些配置。

会发生什么:大概是 web 部署 URI 编码路径,替换 % =&gt; %25( =&gt; %28) =&gt; %29。它一遍又一遍地这样做:

obj\Release(Prod)
obj\Release%28Prod%29
obj\Release%2528Prod%2529
obj\Release%252528Prod%252529
...

直到路径超过 MAX_PATH=260。

【讨论】:

为什么要将我的答案和他的解决方法复制到新答案中?【参考方案4】:

我遇到了同样的事情,尽管它没有解决问题,但我发现如果我将解决方案配置从包含“(”或“)”的构建中切换出来

然后在发布对话框中使用适当的构建,它不会出错。

【讨论】:

是的,正如我在后续回答中所说,我通过将我的配置重命名为 ReleaseTest、ReleaseProd 等解决了这个问题,并且一切正常。问题是,为什么微软还没有注意到或修复这个错误?!为什么它只是有时会发生(而且,当它发生时,你会永远被它困在那个项目上)?

以上是关于VS2012 & 2013:无法发布服务项目 - 指定路径太长的主要内容,如果未能解决你的问题,请参考以下文章

来自 VS2013 的远程调试无法连接到远程调试监视器

我无法在 VS2012 中将服务引用(WCF 库)添加到 MVC4

无法使用 Visual Studio 2013 调试托管代码(“无法评估表达式”错误 - 正在使用调试版本)(请注意,VS 2012 有效)

无法启动 VS2012 Profiler

无法在 32 位机器上注册使用 VS2012/VC++ 构建的 COM DLL

VS2012 & TFS2012 单元测试主要问题