Visual Studio 2017无法在.NET 4.7项目中安装nuget包

Fre*_*red 16 nuget visual-studio-2017

尝试将nuget包安装到标准.NET Framework 4.7项目时,我收到以下错误:

指定的路径,文件名或两者都太长.完全限定的文件名必须少于260个字符,目录名必须少于248个字符.

我正在使用Visual Studio 2017 15.3.3 Enterprise(最新和最好的).

鉴于这是我的包,我完全控制源代码.有趣的是,我过去曾使用过这个软件包,名称没有变化,但为了这个,我重新构建它以添加一个功能,现在我收到了这个错误.

更有趣的是,我有来自同一个库的包,具有相同的命名空间约定,具有更长的名称,工作得很好并且已经安装到同一个项目中而没有任何问题.

我已经尝试缩小包名,缩小包本身内的类名,清理构建目录,从nuget服务器清理包home(它是安装了最新nuget.server的本地服务器,否则工作正常),甚至清除相关项目的bin目录,清除所有祖先的所有bin目录到"违规"包,清除包缓存,重新启动计算机并从头开始重建整个nuget包链一切都无济于事.MS MVP之一告诉我"他们已经解决了这个问题".显然不是.

任何帮助都会在这里受到赞赏,我在我的智慧结束时已经没有想法尝试了.

谢谢.

Fre*_*red 8

好的,非常感谢@danmosemsft谁建议挖掘SysInternals进程监视器.在摆弄了一下之后,我终于想出了如何将结果集缩小到只是文件活动.我注意到了,nuget工程师应该注意这个:问题不是一个太长的项目名称,而是,nuget试图更新不再存在的包.为什么它消失是一个尚未解决的谜.我通常不在包目录中,也不要对packages.config文件大惊小怪.我认为这可能与我不耐烦等待VS启动,加载所有好东西然后允许我执行"管理NuGet包" - 更新所有.我记得看到NUnit或FluentAssertions的更新想要执行一些额外的文件活动,除了安装下一个版本,我相信一个脚本.不能保证能说话,因为第三方更新通常"只是工作",所以我没有那么多关注.我没有看到NuGet的"完成"行,所以我认为那是我问题的根源.我没有等到VS安定下来,而是推了一下(嘿,按钮响应所以不应该有任何问题......).

结果,包目录绝对充满了不属于那里的旧东西.所以,我手动清理所有的cruft,手动清理packages.config文件,重新启动VS,等待它安定下来,执行我的NuGet更新和中提琴!没问题 - 即使是单个字符,也没有改变任何ANCESTRAL包名称.

那么,我从中得出什么结论呢?这是我的信念,实际构建nuget和nuget.server的人应该仔细查看被抛出的错误,这样我认为错误不是路径太长的错误,而是"嘿,我没有找到我期望的文件,因此文件名中充满了垃圾(现在可能太长了)所以我会抛出一个错误,说它太长并且退出".它似乎无法处理导致此特定问题的缺失的包/包目录

我通过确保所有包目录都清除所有垃圾并从干净的源重建来解决了我的问题.我的问题现在解决了.

感谢所有回复的人.

更新:虽然上述内容有助于解决方案,但这不是答案.以下是导致此问题的事件序列及其最终解决方案.该解决方案是在C:\中创建用户\ SAM \文档\ Visual Studio的2017年\与AWE.Lib.ADO.MsSqlSvr.ServerEntityHandler的指定名称的项目目录.这工作得很好,没有错误.但是由于从高处命名方案的改变,这个项目的根目录是从"C:\用户\ SAM \文档\ Visual Studio的2017年\项目"到"C:\用户\ SAM \文档\ Visual Studio的2017\Projects\DotNet_4.7\AWE 8.x".没问题,我想 - 因为同事谁也恰好是一个MS MVP曾告诉我,所有的命名长度限制在了2017年VS被删除所以......我感动的项目,从它的当前家庭对目录指定.编译得很好,带来更新但已经安装好的nuget包就好了等等.

或者我想.当我需要添加一个NEW(之前没有成为解决方案的一部分)的nuget包混合时,我收到了上述错误.事实证明,接收解决方案的新名称比VS接受的字符长几个字符 - 命名长度限制仍然存在.

我是如何最终解决这个问题的:在努力解决这个问题之后,我举起双手,决定重新开始 - 一个真正的文件| 新.所以,我开始使用一个名为如下的新解决方案:"C:\ Users\Sam\Documents\Visual Studio 2017\Projects\DotNet_4.7\AWE 8.x\AWE.Lib.ADO.MsSqlSvr.HndlrServerEntity"这个生成一个错误 - 名字太长.我想知道Nuget的错误,它指定名称长度应小于248个字符或最大值为260个字符.

我允许使用新解决方案对话框是这样的:"C:\ Users\Sam\Documents\Visual Studio 2017\Projects\DotNet_4.7\AWE 8.x\AWE.Lib.ADO.MsSqlSvr.HndlrServerEnt",总共106个字符.如果缩短目录,我可以添加名称的长度.如果我缩短实际解决方案名称的长度,VS会再次接受它.只要目录加解决方案名称的总长度小于或等于106个字符,就没有问题.

讨厌位来自创造一个位置的解决方案,有它在各方面工作得很好,说解决方案移动到不同的目录,仍然有它的功能在各个方面(我并不需要添加任何新的NuGet包还),然后尝试在移动后添加一个新的nuget包到混合.这就是触发上述nuget错误的原因.

所以...最终的"修复",使用一个较短的名称,因为似乎106个字符是限制,尽管错误消息说什么(以及MS MVP被告知/告诉我什么).


小智 5

编译器还会对此错误消息提供另一个原因。在构建时,请确保将源代码放置在少于260个字符长的文件夹位置。例如,类似的路径C:\Users\User\source\Services\Exp\Sample-web-application-indot-net-displaying-RestAPI\Sample-web-application-indot-net-displaying-RestAPI\SportsStore长约150个字符,但解决方案中有子文件夹,而子文件夹又包含源代码文件,依此类推。有时某些文件路径的总长度超过了260个字符的长度。

我认为Visual Studio的未来版本将具有更大的长度限制。在此之前,我们可以确保文件名不要太长。

  • 要解决此问题而不将整个源代码移动到硬盘上的另一个文件夹,您可以将驱动器映射到该文件夹​​(如果合适,甚至可以映射到包含所有存储库的父文件夹),然后直接在VS中打开解决方案文件从资源管理器(无法通过VS本身打开)。要将驱动器映射到本地文件夹,请按照[here](https://www.itworld.com/article/2694895/how-to-使用net使用x:\\ localhost \ c $ \ Folder \ Example`映射到Windows文件夹中的驱动器信件)。 (2认同)