Windows에서 깊은 node_modules 구조로 Node.js 애플리케이션을 배포하는 방법은 무엇입니까?


91

궁금한 문제가 발생했습니다. 일부 Node.js 모듈에는 폴더 계층 구조 가 너무 깊어 Windows 복사 명령 (또는 Copy-Item실제로 사용하는 PowerShell )이 경로가 250 이상일 때 악명 높은 "경로가 너무 깁니다"오류가 발생합니다. 긴 문자.

예를 들어 다음은 단일 노드 모듈이 만들 수있는 폴더 계층입니다.

node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...

미친 것처럼 보이지만 Node 모듈에서는 현실입니다.

배포 중에 복사-붙여 넣기를 사용해야합니다 (Git 배포가 옵션 인 Heroku와 같은 "영리한"대상 플랫폼을 사용하지 않음). 이는 Windows에서 심각한 제한 사항입니다.

npm 명령이나 node_modules폴더를 압축 하거나 런타임에 실제로 필요한 것만 포함하는 것이 있습니까? (노드 모듈은 일반적으로 test배포 할 필요가없는 폴더 등을 포함합니다 .)이 문제를 해결하는 다른 아이디어가 있습니까? Windows를 사용하지 않는 것은 불행히도 옵션이 아닙니다. :)


1
프로젝트에 package.jsonwith dependencies세트가 있습니까? 그렇다면 node_modulesnpm을 사용 하지 않고 복사 install하거나 update종속성을 사용할 수 있습니까?
Jonathan Lonowski

4
@JonathanLonowski 우리의 배포 환경은 npm install대상 환경에서의 실행 을 지원하지 않습니다. 로컬에서 "배포 패키지"(기본적으로 ZIP 및 일부 메타 데이터)를 생성하여 대상 머신에 업로드하고 거기에서 추출하면됩니다. 그래서 node_modules직접 포함시켜야 합니다.
Borek Bernard 2012

답변:


24

npm v3 (최근에 출시됨)은 종속성을 평탄화하여이 문제를 해결합니다 . 섹션 아래 https://github.com/npm/npm/releases/tag/v3.0.0 의 릴리스 노트를 확인 flat flat하십시오.

그리고이 문제에 대한 마지막 댓글 https://github.com/npm/npm/issues/3697


5
의 릴리스 노트 flat flat는 이제 다른 페이지에 묻혀 있습니다. 여기에 직접 링크는 다음과 같습니다 github.com/npm/npm/releases/tag/v3.0.0은
존 필립

존 필립 @ 덕분에, 새로운 링크 대답 업데이트
RameshVel

62

이것에 추가하기 위해 ... 나를 도운 또 다른 것은 설치된 모든 모듈을 npm ls.

모듈과 버전의 트리를 제공합니다. 거기에서 어떤 것이 중복인지 식별하기가 매우 쉽습니다 npm dedupe. 그것이 버그인지 또는 무엇인지 잘 모르겠습니다 (노드 v 10.16).

따라서 중복 모듈을 식별 한 후에는를 사용하여 루트 node_module 디렉토리에 설치합니다 npm install dupemodule@1.2.3 --save-dev. 버전이 중요합니다.

그 후 node_modules 디렉토리를 지우고 새로운 npm install.

짧은 버전

  1. npm ls 설치된 모든 모듈 목록을 가져옵니다.
  2. 해당 모듈을 살펴보고 중복 모듈을 식별합니다 ( 버전이 중요 함 ).
  3. npm install module@version --save-dev 루트 node_modules 디렉토리에 해당 모듈을 설치하고 package.json을 업데이트하십시오.
  4. rmdir node_modules node_modules 디렉토리를 삭제합니다.
  5. npm install 종속성의 새 복사본을 가져옵니다.

일단 그렇게하면 모든 것이 훨씬 깨끗해졌습니다.

또한 package.json 파일에 주석을 달아 node_modules 트리를 평평하게하기 위해 가져온 파일을 표시하는 것이 좋습니다.


이것은 나를 위해 잘 작동했습니다. 감사합니다! 내 무지를 용서하지만 모듈이 항상 최상위 수준에 설치되지 않는 이유는 무엇입니까?
Caleb 2013

2
@Caleb 다른 모듈이 다른 동일한 모듈의 버전, 아니면 그냥, 그냥 필요한 무엇이든 얻을하기 쉽기 때문에 의존 아마 때문에 다음 ... 난 몰라 요인을 아래로.
Ben Lesh

7
어쨌든 팁 감사합니다. 우리 프로젝트에서 약 1700 개의 중복 파일을 날려 버렸습니다. 삭제는 개발자로서 제가 가장 좋아하는 부분입니다! 또한 package.json에 주석을 추가하는 방법을 찾고있는 사람을 위해 다음과 같은 답변이 있습니다. stackoverflow.com/questions/14221579/…
Caleb

github.com/joyent/node/issues/6960 node guy는 Windows가 일류 시민이라고 말합니다. 그들은 말했다. 그러나 그들은 문제를 해결했고 아무것도 고치지 못했습니다. 행운의 Windows 사용자.
vee

38

나는 당신의 제약을 감안할 때 훌륭한 해결책이 없다고 생각하지만 여기에 도움이 될만한 몇 가지가 있습니다.

  • npm dedupe일부 경로를 단축 할 수있는 디렉토리 계층을 최적화 하는 데 사용 하십시오.
  • 사용 npm install --production개발 도구없이 설치
  • 깊이 중첩 된 종속성 중 일부를 가져 와서 (문제를 피할 수있을 정도로만 권장합니다) 최상위 node_modules 디렉토리로 이동합니다. 이들을 추적하여 어떤 것이 진정한 종속성인지 그리고이 문제에 대한 해결 방법인지 알 수 있습니다.
  • 또는 이러한 깊은 종속성 중 일부를 가장 높은 node_modules디렉터리 로 이동 your_project/node_modules/pkg_with_deep_deps하면 경로가 충분히 짧지 만 여전히 작동 할 수 있습니다. 그래서 이것은 your_project/node_modules/pkg_with_deep_deps/node_modules.
    • require런타임에 제대로 찾을 수 있어야 한다고 생각 합니다. 수동으로 변경 한 내용, 변경 한 이유를 명확하게 문서화하고 자신의 실제 종속성을 정확하게 표현하면됩니다.package.json

이 문제에 대해 자세히 설명 하는 github 문제 토론 이 있습니다.


지적 해 주셔서 감사합니다 (아무도 dedupe몰랐습니다).--production ( npm install -h이 옵션을 표시하지 않았습니다)! ZIP 아카이브를 사용하는 것은 안타깝게도 옵션이 아닙니다. 위의 주석을 참조하십시오.
Borek Bernard 2012

9
npm 중복 제거는 "공통"모듈을 계층 구조에서 가장 낮은 공통 위치로만 평면화합니다. 충분하지. 적절한 솔루션은 전체 계층 구조를 "평탄화"하고 test / doc 디렉토리를 무시할 수 있습니다. 대안은 노드가 tar 파일에서 직접 모듈 읽기를 지원하는 것입니다.
MMind 2011

3
동의한다. 어떤 종류의 "바이너리"패키지 배포 (ZIP, tarball 등)가 매우 유용 할 것이다.
Borek Bernard

11

여기에 종속성을 평평하게하는 "npm-flatten"이라는 노드 모듈을 작성했습니다. https://www.npmjs.org/package/npm-flatten

distrubtion을 찾고 있다면 여기에 완전한 node.js 환경을 .NET 프로젝트와 통합 할 NuGet 패키지를 작성했습니다. http://www.nuget.org/packages/NodeEnv/

피드백을 환영합니다.


이것은 우리에게 효과적이었습니다. 먼저 nmp 중복 제거를 실행했을 때 더 나은 결과를 얻었습니다.
Shaun Rowan 2015

1

저에게 도움이 된 것은 로컬 드라이브를 Node.js 폴더에 매핑하는 것이 었습니다.

net use n : \ computername \ c $ \ users \ myname \ documents \ node.js / persistent : yes

이전 : c : \ users \ myname \ documents \ node.js \ projectname (45 자) 이후 : n : \ projectname (14 자, 31 자 이하)

많은 경우 이로 인해 일부 모듈을 설치할 수있었습니다.

오늘 모든 코드를 USB 드라이브에 백업하려고 할 때이 문제를 다시 발견했다고 말할 것입니다.

"C : \ Users \ myname \ Documents \ Node.js \ angular-phonecat \ node_modules \ karma \ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-cache \ node_modules \ benchmarked \ node_modules \ file-reader \ node_modules \ extend-shallow \ benchmark \ fixtures가 너무 깁니다. "

N : 드라이브 문자를 사용하여 백업을 시도했지만 경로 길이로 인해 일부 경우에는 여전히 실패했지만 위의 것을 수정하는 것으로 충분했습니다.


1

1) 릴리스 빌드 중에 폴더 속성 을 숨김 폴더로 설정하여 Visual Studio에서 이러한 파일 / 폴더를 검색하지 않도록 할 수 있습니다 (단지 node_modules로 설정). 참조 : http://issues.umbraco.org/issue/U4-6219#comment=67-19103

2) CsProject 파일에 다음 XML 노드를 포함하여 패키징 중에 게시 된 파일 또는 폴더를 제외 할 수 있습니다.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <OutputPath>bin\</OutputPath>
   <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
  <ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
</PropertyGroup>

1

Microsoft Node.js Guidelines 에서 하나의 솔루션을 찾았습니다 .

  • 짧은 경로 (예 : c : \ src)에서 시작
  • > npm install -g rimraf 초과하는 파일 삭제 max_path
  • > npm dedupe 중복 패키지를 최상위 수준으로 이동
  • > npm install -g flatten-packages 모든 패키지를 최상위 수준으로 이동하지만 버전 관리 문제가 발생할 수 있습니다.
  • npm@3만들려고 시도하는 업그레이드node_modules폴더 계층 구조를 최대한 평평 .
    • Node v5와 함께 제공
    • 또는… > npm install –g npm-windows-upgrade

0

이것은 적절한 해결책이 아니라 급한 경우 해결 방법이지만 7-Zip 을 사용 하여 폴더를 압축하고 압축 된 파일을 이동하고 아무 문제없이 압축을 풀 수 있습니다.

이 솔루션을 사용하여 깨끗한 npm 설치를 수행 할 수없는 Node.js 애플리케이션을 배포했습니다.


네. 이것은 몽구스를 설치할 때마다 수행하는 작업입니다. 네이티브 코드가 있고 여러 버전의 Visual Studio가 있습니다 = 실패. VS를 열고 실패한 각 .sln 파일을 가져 와서 다시 빌드 할 수 있습니다. 그러나 필요에 따라 전체 node_modules \ mongoose 폴더 세트에 대해 XCOPY하는 것이 더 쉽습니다 (물론 버전보기).
Michael Blankenship
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.