场合
我想在Windows托管的开发环境中使用gulp和相关的前端工具链。我试图使用像浏览器同步这样的gulp插件,因为node_modules文件夹图表会使Windows文件路径过长而无法复制文件。我现在想在Windows上处理这个问题的实用方法,无论Node社区可能提供或不提供什么来改善Windows上的npm可用性。
2个问题
Windows的npm工作流程是否按照预期的方式运行? "运行命令并安装文件" (例如,与OSX上的npm相比,Linux上的npm,ruby gems甚至是nuget)我不想在每次在Windows上使用npm时都想要进行大量的手动文件编辑,符号链接等。
是否有针对npm和节点执行的文档齐全,稳定的Cygwin工作流来解决Windows API文件路径限制?
下面列出的血腥细节...
一般问题
我当前的黑客
其他难吃的解决方法
符号链接可用于缩短文件路径,但这些都是kludgy hacks。随着npm生态系统的增长,嵌套的依赖链将变得太长,这种解决方法变得无法使用。
在我遇到的一个帖子中提到了将所有依赖项添加到根文件夹的package.json 文件中。虽然这种方法会使文件夹结构变平并防止加载重复模块,但这种解决方法感觉不自然。它还会破坏npm的可用性,持久性和生产力,因为你必须手动或使用一些hacky脚本来安装文件和文件夹。这种方法也容易受到符号链接方法可能最终遭受的同样命运的影响。
答案 0 :(得分:55)
Windows上深层嵌套文件夹的问题主要是从npm版本3.x
开始解决的。
根据npm:
.npm @ 3使安装"最大限度地平稳"通过将所有内容提升到顶级node_modules。这意味着嵌套只发生在冲突上,因此树不应该变得非常深。因此,窗口路径长度限制不应该进入。
我刚刚安装了npm 3.1.0
,并在一个抛出可怕的The specified path, file name, or both are too long
错误的软件包上试用了它。
问题消失了。
您可以从此处获取最新的npm版本:npm releases
答案 1 :(得分:19)
Windows 8.1和10可以选择增加Win32路径限制:
答案 2 :(得分:12)
这是一种解决方案。
有一些节点模块可以为您平衡依赖关系。
链接在这里:
这些模块正在做什么也可以手动完成。这是迄今为止唯一存在的真正解决方案,即将所有模块放在一个层次上,彼此需要,而不是将所有模块的私有副本深深嵌套。
答案 3 :(得分:3)
艾伦 -
从您链接的github问题
npm默认会在安装时添加重复数据删除时间。这比Node的模块系统更改更加可行,但它仍然不是很简单,并且需要对一些长期存在的模式进行大量的重新设计。
这是(最终)目前正在npm工作,名称为multi-stage-install
,目标是npm@3
。 npm
开发负责人Forrest Norvell将在新的一年中花一些时间在Windows上运行,因此请在npm
问题跟踪器上创建与Windows相关的问题< https://github.com/npm/npm/issues>
答案 4 :(得分:3)
我有同样的问题。扁平化依赖关系并不是一个完整的解决方案,因为您可能正在使用依赖于同一依赖模块的不同版本的模块。我发现gulp-run模块在展平后停止工作(与我怀疑的有关bin / .bin目录的模块假设有关)。 DRAT!
有很多关于这个问题的讨论,但看不到任何解决方案: https://github.com/joyent/node/issues/6960
https://github.com/npm/npm/issues/3697
为我工作的一种解决方法是手动添加我的项目并不明确需要的依赖项。
如果你想确定哪些软件包给你带来问题,我发现PathLengthChecker非常有用。只需提取EXE并运行GUI或命令行应用程序即可。我发现问题的另一种方法是尝试在Visual Studio中构建,但在没有告诉你哪个目录名太长的情况下失败了。
这是我解决方法的命令行示例:
mkdir c:\reallylongdirectorywillbreakinwindows
cd c:\reallylongdirectorywillbreakinwindows
npm init
npm install --save-dev grunt-bower-task
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260
我回来了:
261:C:\ reallylongdirectorywillbreakinwindows \ node_modules \ grunt-bower-task \ node_modules \ bower \ node_modules \ update-notifier \ node_modules \ latest-version \ node_modules \ package-json \ no de_modules \注册表-URL \ node_modules \ npmconf \ node_modules \配置链\ readme.markdown
[snip - 其中有12个]
根据 npm ls 命令:
└─┬ grunt-bower-task@0.4.0
├── async@0.1.22
├─┬ bower@1.3.12
│ ├─┬ update-notifier@0.2.0
│ │ ├─┬ latest-version@0.2.0
│ │ │ └─┬ package-json@0.2.0
│ │ │ └─┬ registry-url@0.1.1
│ │ │ └─┬ npmconf@2.1.1
│ │ │ ├─┬ once@1.3.1
│ │ │ │ └── wrappy@1.0.1
让我们使用npmconf - 它是导致问题的所有超长文件的容器。我们需要npmconf 2.1.1。
npm install --save-dev npmconf@2.1.1
(now delete the node_modules directory - you may have to use Windows Explorer if you can't do it with rmdir /s)
npm install
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260
没有结果 - 所有文件都在限制范围内!
这里显而易见的警告是,每个程序包只能运行一次 - 同一模块的不同版本的依赖关系不能安装在根node_modules级别,因为节点没有考虑目录结构中的版本
这种解决方法并不完美,但它解决了我在Windows上使用节点工作的主要目标,并且由于解决方案在package.json中是正确的,因此该解决方法适用于其他开发人员和构建服务器,无需任何手动或全局大惊小怪。
答案 5 :(得分:2)
如果您可以全局安装它,这可能是一种解决方法:
您可以将npm安装全局模块的路径调整为非常短的路径(通常是c:\ users \ {username} \ AppData \ Roaming \ npm \ npm_modules),这需要很多字符。
要进行调整,请参阅此处:Change default global installation directory for node.js modules in Windows?
如果您将其调整为,例如c:\ n \,在某些情况下可能会解决问题。
答案 6 :(得分:0)
这是最终为我解决的问题......
安装gulp并收到错误后,运行... gulp
当您看到包失败时,请使用--no-bin-link
手动安装。
sudo npm install {package} --no-bin-link
{package}是有问题的包。
在完成所有这些后,我在插件中收到错误' gulp-notify'消息:未找到:notify-send。
这是由于Vagrant的插件问题。您可以关闭通知..
export DISABLE_NOTIFIER=true;
或者使用Vagrant安装插件。
祝您好运..即使遵循了很多人的建议,我也花了很长时间。
布兰登
答案 7 :(得分:0)
在Windows中:
C:\scotchbox/public/gulpProject
cmd
并按 Enter npm install
答案 8 :(得分:0)
.vendor-list-item {
width: 33%;
float: left;
}
。您将拥有整个展平 npm install --no-bin-link