节点npm windows文件路径太长,无法安装软件包

节点npm windows文件路径太长,无法安装软件包,windows,node.js,npm,filepath,Windows,Node.js,Npm,Filepath,形势 我想在Windows托管的开发环境中使用gulp和相关的前端工具链。我在尝试使用浏览器同步之类的gulp插件时遇到了麻烦,因为node_modules文件夹图呈扇形展开,使得windows文件路径过长,无法复制文件。我想要一个实用的方法来处理这个问题,不管节点社区将来可能提供或不提供什么来改善Windows上的npm可用性 2个问题 是否有一个适用于Windows的npm工作流程能够按照预期的方式工作?“运行命令并安装文件”(例如,与OSX上的npm、Linux上的npm、ruby gem

形势

我想在Windows托管的开发环境中使用gulp和相关的前端工具链。我在尝试使用浏览器同步之类的gulp插件时遇到了麻烦,因为node_modules文件夹图呈扇形展开,使得windows文件路径过长,无法复制文件。我想要一个实用的方法来处理这个问题,不管节点社区将来可能提供或不提供什么来改善Windows上的npm可用性

2个问题

  • 是否有一个适用于Windows的npm工作流程能够按照预期的方式工作?“运行命令并安装文件”(例如,与OSX上的npm、Linux上的npm、ruby gems甚至nuget相当),每次在Windows上使用npm时,我都不想处理大量手动文件编辑、符号链接等

  • 对于npm和节点执行,是否有一个完善的、稳定的Cygwin工作流来绕过Windows API文件路径限制

  • 血淋淋的细节如下

    一般问题

    • 从标准Windows命令提示符运行npm安装在嵌套较深的节点\u模块层次结构上失败
    • 根据Joyent的github repo线程,对于以Windows为中心的环境中的开发人员来说,没有任何令人满意的解决办法。(真的吗?
    • NT内核支持最多32767个字符的文件路径长度
    • Windows API的最大路径限制为260个字符
    • Windows API处理所有主要Windows Shell等的文件操作,包括:Explorer、CMD、Powershell、MyGit bash等(MS真的吗?NTFS存在多久了?
    • Cygwin支持长文件路径,但由于crlf格式,npm.cmd无法开箱即用。我在npm上尝试了DOS2Unix转换,以使其与Cygwin一起工作,但这似乎还有其他问题
    我当前的黑客行为

    • 在C:\的根目录上创建一个“n”文件夹作为临时区域,因为 这会缩短我的文件夹路径
    • 在“n”文件夹中运行npm,安装我需要的模块
    • 启动Cygwin并使用cp将node_modules文件夹复制到目标项目中
    • 当依赖项发生变化或需要启动新项目时,请清洗并重复
    其他令人不快的解决办法

    符号链接可以用来缩短文件路径,但这些都是拙劣的技巧。随着npm生态系统的发展,嵌套的依赖链将变得太长,这种变通方法将变得不可用


    在我遇到的一个线程中提到了向根文件夹的package.json文件添加所有依赖项。尽管这种方法将使文件夹结构扁平化,并防止加载重复的模块,但这种解决方法感觉不自然。它还破坏了npm的可用性、耐用性和生产率,因为安装后您必须手动或使用一些黑客脚本来处理文件和文件夹。这种方法也容易受到符号链接方法最终可能遭受的同样命运的影响

    这是一个解决方案

    有一些节点模块可以为您平展依赖关系
    链接如下:

    这些模块所做的工作也可以手动完成。这是目前存在的唯一真正的解决方案,即将所有模块放在一个单独的级别上,相互要求,而不是所有模块都将其依赖项的私有副本深度嵌套。

    Allan-

    从您链接的github问题

    默认情况下,npm将在安装时添加重复数据消除。这比改变节点的模块系统要可行得多,但这仍然不是一件小事,需要对一些根深蒂固的模式进行大量修改


    这(最后)是npm目前正在进行的工作,名称为
    多阶段安装
    ,目标是
    npm@3
    npm
    开发负责人Forrest Norvell将在新的一年里花一些时间在Windows上运行,因此请务必在
    npm
    问题跟踪器上创建与Windows相关的问题,这是我最终解决的问题

    安装gulp并收到错误后,运行。。。吞咽

    当您看到某个软件包出现故障时,请使用
    --无bin链接
    手动安装它

    sudo npm install {package} --no-bin-link
    
    其中{package}是有问题的包

    在所有这些之后,我在插件“gulp notify”消息中收到一个错误:notify send

    这是由于Vagrant的插件问题造成的。您可以关闭通知

    export DISABLE_NOTIFIER=true;
    
    或者使用安装插件

    祝你好运。。我花了很长时间在这个问题上,甚至在遵循了很多人的建议之后


    布兰登

    我也有同样的问题。扁平化依赖项并不是一个完整的解决方案,因为您可能正在使用依赖于同一依赖模块的不同版本的模块。我发现gulp run模块在扁平化后停止工作(我怀疑这与模块对bin/.bin目录的假设有关)。该死

    关于这个问题有很多讨论,但看不到解决方案:

    一个对我有效的解决方法是手动添加我的项目不明确需要的依赖项

    如果您想确定哪些软件包给您带来了问题,我发现这非常有用。只需提取EXE并运行GUI或命令行应用程序。我发现问题的另一种方法是尝试在VisualStudio中构建,但在没有告诉您哪个目录名太长的情况下失败了

    下面是我的解决方法的命令行示例:

    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\u modules\grunt bower task\node\u modules\bower\node\u modules\update notifier\node\u modules\latest version\node\u modules\package json\no de_模块\注册表url\节点_模块\
    └─┬ 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
    
    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