노드 npm Windows 파일 경로가 너무 길어서 패키지를 설치할 수 없습니다.


89

상태

Windows에서 호스팅하는 개발 환경에서 gulp 및 관련 프런트 엔드 도구 체인을 사용하고 싶습니다. node_modules 폴더 그래프가 파일을 복사하기에 너무 긴 Windows 파일 경로를 만들기 때문에 Browser-Sync와 같은 gulp 플러그인을 사용하려는 벽에 부딪 혔습니다. 노드 커뮤니티가 향후 Windows에서 npm 사용성을 개선하기 위해 제공 할 수있는 것과 제공하지 않을 수있는 것에 관계없이 지금 바로 Windows에서이 문제를 처리하기위한 실용적인 접근 방식을 원합니다.

2 개의 질문

  1. 의도 한대로 작동하는 Windows 용 npm 워크 플로가 있습니까? "명령을 실행하고 파일 설치"(예 : OSX의 npm, Linux의 npm, ruby ​​gems 또는 nuget과 비슷 함) 사용할 때마다 수동 파일 편집, 심볼릭 링크 등을 조작하고 싶지 않습니다. Windows의 npm.

  2. Windows API 파일 경로 제한을 해결하기 위해 npm 및 노드 실행을위한 잘 문서화되고 안정적인 Cygwin 워크 플로가 있습니까?

아래 나열된 피투성이 세부 정보 ...

일반적인 문제

  • 표준 Windows 명령 프롬프트에서 npm install을 실행하면 깊이 중첩 된 node_modules 계층에서 실패합니다.
  • Joyent의 github repo 스레드에 따르면 이것은 Windows 중심 환경의 개발자를위한 적절한 해결 방법이없는 인정 된 문제 입니다. ( 정말? )
  • NT 커널은 최대 32,767 자의 파일 경로 길이를 지원합니다.
  • Windows API의 MAXPATH는 260 자로 제한됩니다.
  • 포함하여 Windows API 핸들 파일의 모든 주요 윈도우 쉘에 대한 운영 및 이것 저것 : 등 탐색기, CMD, 파워 쉘, MYSgit 강타는 ( ? MS는 정말 얼마나 오래는 NTFS는 주변에있다? )
  • Cygwin은 긴 파일 경로를 지원하지만 npm.cmd는 crlf 형식화로 인해 기본적으로 작동하지 않습니다. Cygwin과 함께 작동하도록 npm에서 DOS2Unix 변환을 시도했지만 다른 문제가있는 것 같습니다.

내 현재 해킹

  • "n"폴더를 C : \의 루트에 준비 영역으로 만듭니다. 이렇게하면 폴더 경로가 단축됩니다.
  • "n"폴더 내에서 npm을 실행하여 필요한 모듈을 설치합니다.
  • Cygwin을 실행하고 cp를 사용하여 node_modules 폴더를 대상 프로젝트에 복사하십시오.
  • 종속성이 변경되거나 새 프로젝트를 시작해야 할 때 헹구고 반복하십시오.

기타 불쾌한 해결 방법

심볼릭 링크 는 파일 경로를 단축하는 데 사용할 수 있지만 이는 복잡한 해킹입니다. npm 생태계가 성장함에 따라 중첩 된 종속성 체인이 너무 길어지고이 해결 방법을 사용할 수 없게됩니다.

루트 폴더의 package.json 파일에 모든 종속성을 추가하는 것은 내가 만난 한 스레드에서 언급되었습니다. 이 방법은 폴더 구조를 평평하게하고 중복 모듈의로드를 방지하지만이 해결 방법은 부 자연스럽게 느껴집니다. 또한 수동으로 또는 일부 해키 스크립트를 사용하여 설치 후 파일 및 폴더를 조작해야하기 때문에 npm의 유용성, 내구성 및 생산성을 떨어 뜨립니다. 이 접근 방식은 또한 Symbolic Links 접근 방식이 결국 겪을 수있는 동일한 운명에 취약합니다.


나는 이것이 해결되었다고 거의 생각했다. npm.cmd 및 npm
Allan McLemore

일부 npm 모듈은 Visual Studio를 사용하여 파일을 빌드하기 때문에 Windows API 경로 제한으로 인해 npm을 사용할 수 없습니다. 이것은 내가 npm Browser-Sync : C : \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets (301,5) : error MS B3491 : could "Release \ obj \ validation \ validation.tlog \ validation.lastbuilds tate"파일에 줄을 쓰지 마십시오. 지정된 경로, 파일 이름 또는 둘 다 너무 깁니다. 완전한 파일 이름은 260 자 미만이어야하며 디렉토리 이름은 248 자 미만이어야합니다.
Allan McLemore

Windows에서 노드 모듈을 npm으로로드하기 위해 "taffy-pulling"접근 방식을 사용할 수 있습니다. 여기에는 npm 설치, npm 중복 제거, npm 축소 및 rm -r node_modules의 몇 라운드가 포함됩니다. 이 작업을 반복적으로 수행하면 긴 파일 경로를 어느 정도 다듬는 것처럼 보이지만 마치 끝날 때까지 수행하지 않는 것과 같습니다. 누구든지 이것을 성문화하거나 자동화 도구를 작성하여 이것을 더 많은 턴키로 만들 수 있습니까?
Allan McLemore

"해키 스크립트"에 대해 말하면서 나는 TERRIBLY 해키가 아닌 것으로 생각되는 스크립트를 작성했습니다. 설치 후 모듈의 디렉토리 구조를 프로그래밍 방식으로 평탄화하는 데 사용할 수있는 fenestrate 라는 도구를 만들었습니다 . 전역 npm 설치 후 후크로 설치할 수 있습니다.
zetlen 2014 년

2
@yoneal 개인적인 용도로 빠르게 시작하려면 fenestrate가 node_modules 폴더를 재귀 적으로 걸어야하므로 깊은 종속성에서 수동으로 실행할 필요가 없습니다. 그러나 이러한 종속성을 포크하는 것이 좋을 것입니다. 간단한 fenestrate 구성을 가진 많은 포크 된 모듈이 npm 관리자에게 훌륭한 메시지를 보낼 것이라고 생각합니다.
zetlen 2014

답변:


58

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 릴리스


4
Windows 시스템에서 npm 3.x 업데이트로도 성공했습니다. 뻔뻔한 플러그 : Windows triplet.fi/blog/…
Tx3

21

Windows 8.1 및 10에는 Win32 경로 제한을 늘리는 옵션이 있습니다.

  • 그룹 정책 편집기 열기 ( Windows+를 누르고 R를 입력 gpedit.msc하고 누르십시오 Enter)
  • 다음 디렉토리로 이동하십시오. Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • 더블에 Win32에서 긴 경로 사용 옵션을하고 있습니다.

여기에 이미지 설명 입력


옵션을 사용할 수 없었습니다. 그리고 fwiw, 저는 win 7 pro에서 업그레이드하여 가능한 원인이 될 수 있습니다
Evan Morrison

@EvanMorrison "Filesystem \ NTFS \ Enable NTFS long paths"는 이후 win10 빌드에서 "FileSystem \ Enable Win32 long paths"로 이름이 변경되었습니다. 향후 참조를 위해 답변을 업데이트했습니다.
Marcelo Mason

1
승리 서버 2012 R2에 대한 어떤 생각
sairfan

12

이것은 해결 방법입니다.

종속성을 평탄화하는 몇 가지 노드 모듈이 있습니다.
링크는 다음과 같습니다.

이러한 모듈이 수행하는 작업은 수동으로 수행 할 수도 있습니다. 이것은 현재 존재하는 유일한 실제 솔루션입니다. 즉, 모든 모듈이 서로를 필요로하는 단일 레벨에있는 유일한 솔루션입니다. 모든 모듈이 종속성의 개인 사본이 깊게 중첩되는 대신에 필요합니다.


10
내가 발견 평평-패키지를 잘 문서화하고 쉽게 사용할 수 있도록.
StriplingWarrior

3

앨런-

연결 한 github 문제에서

npm은 기본적으로 설치시 중복 제거를 추가합니다. 이것은 Node의 모듈 시스템이 변경되는 것보다 훨씬 더 실현 가능하지만 여전히 사소한 것은 아니며 일부 오랜 패턴을 재 작업해야합니다.

이 이름으로 가고, NPM에서 작품 현재 (마지막으로)입니다 multi-stage-install, 그리고 대상입니다 npm@3. npm개발 책임자 인 Forrest Norvell은 새해에 Windows에서 실행하는 데 약간의 시간을 할애 할 예정이므로 npm문제 추적기 < https://github.com/npm/npm/issues > 에서 Windows 관련 문제를 생성 하십시오.


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

[스닙-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에서 옳기 때문에 해결 방법은 다른 개발자와 수동 또는 글로벌 소란없이 서버를 구축 할 수 있습니다.


2

전체적으로 설치하는 것이 괜찮다면 해결 방법이 될 수 있습니다.

npm이 전역 모듈을 설치하는 경로 c:\users\\{username}\AppData\Roaming\npm\npm_modules를 이미 많은 문자를 사용하는 매우 짧은 (일반적으로 :)으로 조정할 수 있습니다 .

조정하려면 여기를 참조하십시오. Windows에서 node.js 모듈의 기본 전역 설치 디렉토리를 변경 하시겠습니까?

예를 들어 조정 c:\n\하면 문제가 해결 될 수 있습니다.


1

이것이 마침내 나를 위해 고친 것입니다 ...

gulp를 설치하고 오류를 수신 한 후 다음을 실행하십시오. gulp

패키지가 실패하면을 사용하여 수동으로 설치하십시오 --no-bin-link.

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

여기서 {package}는 문제가있는 패키지입니다.

이 모든 후 플러그인 'gulp-notify'메시지에서 오류가 발생했습니다. 찾을 수 없음 : notify-send.

이는 Vagrant의 플러그인 문제 때문입니다. 알림을 끌 수 있습니다 ..

export DISABLE_NOTIFIER=true;

또는 Vagrant로 플러그인을 설치하십시오 .

행운을 빕니다 .. 많은 사람들의 추천을 따랐 는데도 오랜 시간을 보냈습니다.

Brandon


0

창에서 :

  1. Windows 탐색기를 사용하여 방랑 공유 폴더로 이동하십시오 (나는 scotchbox를 사용하고 있습니다). C:\scotchbox/public/gulpProject
  2. 폴더의 주소 표시 줄에 입력 cmd하고Enter
  3. 꿀꺽 꿀꺽 설치하십시오 npm install

1
동일한 답변을 복사하여 붙여 넣지 마십시오 . 대신 중복으로 플래그를 지정해야합니다. 또한 게시물에서 욕하지 마십시오.
Tunaki

0

npm install --no-bin-link. 당신은 전체가 평평하게 될 것입니다 node_modules

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.