我有一个VS2012解决方案,包含10个项目,突然之间,我无法再将我的服务项目发布到任何文件夹。
当我尝试发布到 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中构建和发布相同的项目 - 它有相同的错误消息。
我的一位同事说他看到了同样的事情,但是通过从他的配置名称中移除来修复它。我尝试了这个,这就是为什么我的配置名称现在是“发布(产品)”而不是“发布(产品)”,但它没有任何区别。
我还打开了这个错误建议的文件是导致错误的原因: C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.targets
..并注意到那里有关于 AnyCPU 平台名称的内容。我尝试让我的服务项目使用“AnyCPU”和“任何CPU”(抑郁的叹息),但似乎没有任何区别。
<PropertyGroup Condition=" '$(IntermediateOutputPath)' == '' ">
<IntermediateOutputPath Condition=" '$(PlatformName)' == 'AnyCPU' Or '$(PlatformName)' == ''">$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
. . .
</PropertyGroup>
还有其他人看过这个问题吗?
(稍后......)
这太奇怪了(令人沮丧)。
我的解决方案有5种配置 - 默认的Debug和Release,以及Test,PreProduction和Production环境的额外配置。
如果我选择包含括号的这三个配置中的任何一个,我会得到这个荒谬的“指定的路径太长”错误,因为VS2012破坏了路径名(如我上面的第一个屏幕截图所示)。
我不禁疑惑......这是某种VS2012错误,处理配置名称中的空格或括号?
答案 0 :(得分:2)
在发布到文件时,我可以直接部署到,
(
,)
上Target Location
的{{1}}选项卡上的路径系统(即不从配置名称构建路径) - 但这不是基于配置定位不同位置的解决方案。
如果要在配置名称中保留特殊字符,但指定不会导致部署文件夹的路径并发出此帖子可能有所帮助:Visual Studio: How to properly build and specify the configurations and platforms for x64 and x86
具体使用此处的设置:
在项目属性页面中,选择各种排列 解决方案下拉列表中的调试/发布和x86 / x64。确保 目标处理器设置正确(它应该是,但我找到了实例 当他们不是,可能是因为我以前的尝试)。也, 设置输出目录。这应该是好的和自动的 (/ bin / x86 / Debug等)。如果没有,请修复。
看看实际上似乎正在发生的事情也很有用:
查看插入的数字:
Connection
是一个经过编码的%25
,%
是一个经过编码的%28
(
是一个经过编码的%29
查看路径:
OBJ \推出%252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525 *** *** 28%PROD *** 252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525 29 ***)
我认为发生了什么:
所以这似乎是一个很好的线索,这些是URL或XML编码。似乎正在发生的事情是)
被编码为(
,然后%28
被递归编码为%
- 生成无限%25
。
一个更有趣的问题实际上是为什么它会停止使用此错误从%252525252525252525...
创建25
的原因(两次都停止创建包含%
在内的214个字符的25个%
- 不是一个非常有趣的数字。)
查看您引用的文件28 / 29
- 这些字符串是针对XML编码的。我会说这肯定是一个错误...我没有修复的建议。
答案 1 :(得分:1)
好吧,我将接受马修的回答作为&#34;接受的答案&#34;。
谢谢你的帮助。
这是一个非常奇怪的问题,我很惊讶没有其他人在别处报道过。
问题摘要(如果微软感兴趣,或者如果有人在未来几年尝试将此问题发布给Google)
使用配置名称&#34; 发布(产品)&#34;,我可以愉快地构建我的代码,在本地运行它,但是当我尝试发布它时,甚至是本地驱动器,我收到此消息:
这是一个奇怪的例外,因为Build 创建了&#34; obj \ Release(Prod)&#34;文件夹,没有任何问题。它只是Publish,它似乎在找错了它的地方。
按照此主题中给出的建议,今天我尝试使用相同的设置创建新配置,但名称中没有空格:&#34; 发布(SecondProd)&# 34 ;.看看会发生什么:
有趣的是,尽管出现此错误, 仍然使用此名称创建新配置。
无论如何,我重新创建了一个名为 ReleaseProduction 的新配置,它运行正常。
当然,我需要创建新的&#34; web.config&#34;此名称的转换,因为当您基于旧名称创建新配置时,不会自动复制此名称。
最后一个想法(只是为了混淆更糟糕的事情!)
当我发布此请求帮助时,我的解决方案中的服务项目拒绝发布到本地驱动器,但我的网站将发布好。
今天,自从我上次尝试网站发布两天后,我发现网站也现在产生相同的GetFullPath异常。什么都没改变!我们使用TFS,我已经在两天前与我的项目文件进行了文件比较,并且它们完全相同!
这是VS2012中的一个非常奇怪的错误。 VS2013。
不过,这个解决方案&amp;其中的项目最初是VS2010项目。它们在一年前升级到VS2012,但这个Publish问题最近才开始发生。我不确定问题是否与使用升级的VS项目有关。再次感谢您的帮助。
现在我有一些Test,PreProd&amp;要重新创建的生产配置!
也许我会先喝啤酒..
答案 2 :(得分:0)
总结并完成马修的答案:
原因: 您的配置中包含需要URI编码的字符 - 在您的情况下,&#39;(&#39;和&#39;)& #39;
解决方法: 重命名这些配置。
会发生什么: 可能是网络部署对路径进行URI编码,替换% => %25
,( => %28
,) => %29
。它一遍又一遍地这样做:
obj\Release(Prod)
obj\Release%28Prod%29
obj\Release%2528Prod%2529
obj\Release%252528Prod%252529
...
直到路径超过MAX_PATH = 260。
答案 3 :(得分:0)
我遇到了同样的事情,尽管它没有解决问题我发现如果我将解决方案配置从包含“(”或“)”的构建中切换出来
然后在发布对话框中使用适当的版本,它不会出错。