Node npm windows file paths are too long to install packages

后端 未结 9 1441
野性不改
野性不改 2020-11-29 17:58

Situation

I want to use gulp and related front-end tool chains in Windows-hosted development environments. I\'m hitting a wall trying to use gulp pl

相关标签:
9条回答
  • 2020-11-29 18:26

    Windows 8.1 and 10 have an option to increase the Win32 path limit:

    • Open Group Policy Editor (Press Windows+R and type gpedit.msc and hit Enter)
    • Navigate to the following directory: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
    • Doubleclick on Enable Win32 long paths option and enable it.

    0 讨论(0)
  • 2020-11-29 18:28

    The problem with deeply nested folders on Windows has been mostly solved starting with npm version 3.x.

    According to npm:

    .npm@3 makes the install "maximally flat" by hoisting everything it can to the top level node_modules. This means nesting only occurs on conflicts and as such, trees should never get very deep. As such, the windows path length limitation shouldn't be run into.

    I have just installed npm 3.1.0 and tried it out on a package that was throwing the dreaded The specified path, file name, or both are too long error.

    The problem went away.

    You can get the latest npm builds from here : npm releases

    0 讨论(0)
  • 2020-11-29 18:42

    This is what finally fixed it for me...

    After installing gulp and receiving errors, run... gulp

    When you see a package failing, install it manually with --no-bin-link.

    sudo npm install {package} --no-bin-link
    

    Where {package} is the package that is having problems.

    After all of this I was receiving an Error in plugin 'gulp-notify' Message: not found: notify-send.

    This was due to a plugin issue with Vagrant. You can either turn off notifications..

    export DISABLE_NOTIFIER=true;
    

    Or install the plugin with Vagrant.

    Best of luck.. I spent a long time on this, even after following a lot of people's recommendations.

    Brandon

    0 讨论(0)
  • 2020-11-29 18:43

    I have the same issue. Flattening the dependencies isn't a complete solution, since you might be using modules that depend on different versions of the same dependent module. I discovered the gulp-run module stopped working after flattening (related to module assumptions about bin/.bin directories, I suspect). Drat!

    There's lots of discussion about the problem, but no solution in sight: https://github.com/joyent/node/issues/6960

    https://github.com/npm/npm/issues/3697

    A workaround that's working for me is to manually add dependencies my project doesn't explicitly need.

    If you want to identify which packages are giving you problems, I found PathLengthChecker quite useful. Just extract the EXE and run the GUI or command line app. The other way I've uncovered the problem is to try to build in Visual Studio, but it fails without telling you which directory name is too long.

    Here's a command line example of my workaround:

    mkdir c:\reallylongdirectorywillbreakinwindows
    cd c:\reallylongdirectorywillbreakinwindows
    npm init
    npm install --save-dev grunt-bower-task
    PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260
    

    I got back:

    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\registry-url\node_modules\npmconf\node_modules\config-chain\readme.markdown

    [snip - there were 12 of them]

    According to the npm ls command:

    └─┬ 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
    

    Let's go with npmconf - it's the container for all the over-length files that are causing issues. We need 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
    

    No results - all files are within limits!

    The obvious caveat here is that it only works once per package - dependencies on different versions of the same module can't be installed at the root node_modules level because node doesn't account for versions in the directory structure.

    This workaround isn't perfect, but it solves my main goals of having node work on Windows, and since the resolution is right in package.json, the workaround works for other developers and build servers without any manual or global fussing.

    0 讨论(0)
  • 2020-11-29 18:44

    This is a work around solution.

    There are some node modules that flattens your dependencies for you.
    Links are here:

    • npm-flatten
    • npm-dedupe

    What these modules are doing can be done manually as well. This is the only real solution exists as of now, i.e to have all your modules at a single level, requiring each other, instead of all having private copies of their dependencies nested deeply.

    0 讨论(0)
  • 2020-11-29 18:46

    Allan -

    From the github issue you linked,

    npm will add dedupe-at-install-time by default. This is significantly more feasible than Node's module system changing, but it is still not exactly trivial, and involves a lot of reworking of some long-entrenched patterns.

    This is (finally) currently in the works at npm, going by the name multi-stage-install, and is targeted for npm@3. npm development lead Forrest Norvell is going to spend some time running on Windows in the new year, so please do create windows-related issues on the npm issue tracker < https://github.com/npm/npm/issues >

    0 讨论(0)
提交回复
热议问题