상태
Windows에서 호스팅하는 개발 환경에서 gulp 및 관련 프런트 엔드 도구 체인을 사용하고 싶습니다. node_modules 폴더 그래프가 파일을 복사하기에 너무 긴 Windows 파일 경로를 만들기 때문에 Browser-Sync와 같은 gulp 플러그인을 사용하려는 벽에 부딪 혔습니다. 노드 커뮤니티가 향후 Windows에서 npm 사용성을 개선하기 위해 제공 할 수있는 것과 제공하지 않을 수있는 것에 관계없이 지금 바로 Windows에서이 문제를 처리하기위한 실용적인 접근 방식을 원합니다.
2 개의 질문
-
의도 한대로 작동하는 Windows 용 npm 워크 플로가 있습니까? “명령을 실행하고 파일 설치”(예 : OSX의 npm, Linux의 npm, ruby gems 또는 nuget과 비슷 함) 사용할 때마다 수동 파일 편집, 심볼릭 링크 등을 조작하고 싶지 않습니다. Windows의 npm.
-
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 접근 방식이 결국 겪을 수있는 동일한 운명에 취약합니다.
답변
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 릴리스
답변
답변
이것은 해결 방법입니다.
종속성을 평탄화하는 몇 가지 노드 모듈이 있습니다.
링크는 다음과 같습니다.
이러한 모듈이 수행하는 작업은 수동으로 수행 할 수도 있습니다. 이것은 현재 존재하는 유일한 실제 솔루션입니다. 즉, 모든 모듈이 서로를 필요로하는 단일 레벨에있는 유일한 솔루션입니다. 모든 모듈이 종속성의 개인 사본이 깊게 중첩되는 대신에 필요합니다.
답변
앨런-
연결 한 github 문제에서
npm은 기본적으로 설치시 중복 제거를 추가합니다. 이것은 Node의 모듈 시스템이 변경되는 것보다 훨씬 더 실현 가능하지만 여전히 사소한 것은 아니며 일부 오랜 패턴을 재 작업해야합니다.
이 이름으로 가고, NPM에서 작품 현재 (마지막으로)입니다 multi-stage-install
, 그리고 대상입니다 npm@3
. npm
개발 책임자 인 Forrest Norvell은 새해에 Windows에서 실행하는 데 약간의 시간을 할애 할 예정이므로 npm
문제 추적기 < https://github.com/npm/npm/issues > 에서 Windows 관련 문제를 생성 하십시오.
답변
나는 같은 문제가 있습니다. 동일한 종속 모듈의 서로 다른 버전에 의존하는 모듈을 사용할 수 있으므로 종속성을 평면화하는 것은 완전한 솔루션이 아닙니다. 나는 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에서 옳기 때문에 해결 방법은 다른 개발자와 수동 또는 글로벌 소란없이 서버를 구축 할 수 있습니다.
답변
전체적으로 설치하는 것이 괜찮다면 해결 방법이 될 수 있습니다.
npm이 전역 모듈을 설치하는 경로 c:\users\\{username}\AppData\Roaming\npm\npm_modules
를 이미 많은 문자를 사용하는 매우 짧은 (일반적으로 :)으로 조정할 수 있습니다 .
조정하려면 여기를 참조하십시오. Windows에서 node.js 모듈의 기본 전역 설치 디렉토리를 변경 하시겠습니까?
예를 들어 조정 c:\n\
하면 문제가 해결 될 수 있습니다.
답변
이것이 마침내 나를 위해 고친 것입니다 …
gulp를 설치하고 오류를 수신 한 후 다음을 실행하십시오. gulp
패키지가 실패하면을 사용하여 수동으로 설치하십시오 --no-bin-link
.
sudo npm install {package} --no-bin-link
여기서 {package}는 문제가있는 패키지입니다.
이 모든 후 플러그인 ‘gulp-notify’메시지에서 오류가 발생했습니다. 찾을 수 없음 : notify-send.
이는 Vagrant의 플러그인 문제 때문입니다. 알림을 끌 수 있습니다 ..
export DISABLE_NOTIFIER=true;
또는 Vagrant로 플러그인을 설치하십시오 .
행운을 빕니다 .. 많은 사람들의 추천을 따랐 는데도 오랜 시간을 보냈습니다.
Brandon