我正在 Visual Studio 2015 CTP6 中尝试 MVC6 + Aurelia 项目,并发现了一些有趣的东西。
我的
node_modules
默认位于项目根目录中,一切正常。但是,我想让源树更有条理,并将 node_modules
、jspm_modules
和相关内容移动到子文件夹中 - 例如。 MyApp\client\node_modules
等等
但是现在 Visual Studio 停止加载项目。这是“VsProjectFault.failure.txt”的异常:
(Inner Exception #1) System.InvalidOperationException: The item metadata "%(FullPath)" cannot be applied to the path "client\node_modules\conventional-changelog\node_modules\lodash.assign\node_modules\lodash._basecreatecallback\node_modules\lodash.bind\node_modules\lodash._createwrapper\node_modules\lodash._basecreatewrapper\node_modules\". C:\Work\xxxxxxxxxx\xxxxxxxxxx.xxx\src\client\node_modules\conventional-changelog\node_modules\lodash.assign\node_modules\lodash._basecreatecallback\node_modules\lodash.bind\node_modules\lodash._createwrapper\node_modules\lodash._basecreatewrapper\node_modules\
at Microsoft.Build.Shared.ErrorUtilities.ThrowInvalidOperation(String resourceName, Object[] args)
at Microsoft.Build.Shared.ErrorUtilities.VerifyThrowInvalidOperation(Boolean condition, String resourceName, Object arg0, Object arg1, Object arg2)
at Microsoft.Build.Shared.FileUtilities.ItemSpecModifiers.GetItemSpecModifier(String currentDirectory, String itemSpec, String definingProjectEscaped, String modifier, String& fullPath)
...
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.VisualStudio.ProjectSystem.Utilities.DataflowExtensions.<>c__DisplayClass37`2.<<CreateSelfFilteringTransformBlock>b__38>d__0.MoveNext()
显然问题在于
node_modules
递归路径太长 - 并且节点跟踪器中存在 bug #6960
Node 需要一种替代方法来实现无限、递归嵌套 Windows 上的 node_modules 文件夹。大多数 Windows 工具、实用程序和 shell 无法处理长度超过 260 个字符的文件和文件夹路径 最多。
...这对我来说似乎已关闭,无法解决:
Node 不会改变,所以这并不是真正的 Node 问题。这 问题不在于模块加载语义,而在于模块 安装语义。 (两者有联系,但不相同。)
但是我不明白该项目首先是如何加载的,因为即使
node_modules
位于项目根目录下,某些路径肯定超过260个符号!
配置中是否有一些设置或其他设置可以帮助 Visual Studio 2015 使用
node_modules
加载项目,这是怎么回事?
我通过使用 组策略编辑器启用 Win32 长路径策略,设法在 Windows 10 开发计算机中修复此问题。以下是所需的步骤(取决于您是否安装了周年更新):
周年更新之前
如果您运行的是 14352 和 RTM 1607 之间的 Windows 10 版本(又名“周年更新”),则需要执行以下操作:
Windows Key
并手动键入 gpedit.msc
,然后按 Enter
键启动 组策略编辑器。
作为替代方案,您也可以通过执行以下注册表命令来获得相同的结果:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
周年更新后
如果您正在运行周年更新后的 Windows 10 版本(RTM 1067 或更高版本),则需要使用以下内容:
Windows Key
并手动键入 gpedit.msc
,然后按 Enter
键启动 组策略编辑器。
Enable Win32 long paths
选项并单击启用它。如果您需要更多详细信息,您还可以查看这篇博文我就该主题撰写。
http://bstruthers.com/weblog/2013/02/06/Cannot_evaluate_the_item_metadata_FullPath/
这是因为VS中的文件路径字符数超出了限制。将文件夹复制到根文件夹中并尝试。
VS2015/project.json 构建 + VS2017/CSProj 构建
http://dan.clarke.name/2017/02/include-execution-files-from-build-with-vs2017-and-net-core/
只需更改为(在“Project”标签内):
<ItemGroup>
<Compile Remove="[ClientAppRoot]\node_modules\**" />
<Content Remove="[ClientAppRoot]\node_modules\**" />
<EmbeddedResource Remove="[ClientAppRoot]\node_modules\**" />
<None Remove="[ClientAppRoot]\node_modules\**" />
</ItemGroup>
我找到了,你可以将解决方案文件移动到你的项目所在的文件夹中。导致该错误的原因是Windows有路径策略,限制了执行路径中提供的字符数。
client\node_modules\conventional-changelog\node_modules\lodash.assign\node_modules\lodash._basecreatecallback\node_modules\lodash.bind\node_modules\lodash._createwrapper\node_modules\lodash._basecreatewrapper\node_modules\". C:\Work\xxxxxxxxxx\xxxxxxxxxx.xxx\src\client\node_modules\conventional-changelog\node_modules\lodash.assign\node_modules\lodash._basecreatecallback\node_modules\lodash.bind\node_modules\lodash._createwrapper\node_modules\lodash._basecreatewrapper\node_modules\
只需将项目文件(包含所有包的整个解决方案)移动到 Work/xxxx 文件夹即可解决问题。
看起来你的项目超出了MAX_PATH, 您可以尝试将项目移至较短的路径(例如 c:\src) 欲了解更多详情,请查看这里
为了解决此问题,我将解决方案移至 C:\ 驱动器。通过这样做,字符被缩短,并且重建项目后不再出现错误。