여러 프로젝트가 node_modules 디렉토리를 공유하도록하려면 어떻게해야합니까?


98

프로젝트를 만들 때마다 노드 모듈의 모든 종속성을 다운로드해야합니다. node_modules를 복사하지 않고 여러 프로젝트에서 중앙 node_modules를 공유 할 수 있습니까?

다음과 같이 매번 많은 명령을 실행해야합니다 ..

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
공통 상위 디렉토리 (있는 경우)에 설치할 수 있습니다. 노드는 d 모듈을 검색 하는 디렉토리로 이동require 합니다. 그렇지 않으면에서 사용할 수있는 공식 "중앙" node_modules폴더 가 없습니다 require().
Jonathan Lonowski 2015

전역 플래그를 사용하여 이러한 패키지를 전역으로 설치할 수 있습니다. 따라서 매번 설치 명령을 실행할 필요가 없습니다. npm install <npm_package_name> -g
Saba Hassan

답변:


92

프로젝트간에 node_modules 디렉토리를 공유 할 수 있습니다.

에서 노드의 설명서 :

require ()에 전달 된 모듈 식별자가 기본 모듈이 아니고 '/', '../'또는 './'로 시작하지 않는 경우 노드는 현재 모듈의 상위 디렉토리에서 시작하고 추가합니다. / node_modules, 해당 위치에서 모듈로드를 시도합니다.

여기에 없으면 파일 시스템의 루트에 도달 할 때까지 상위 디렉토리로 이동하는 식입니다.

예를 들어 '/home/ry/projects/foo.js'에있는 파일이 require ( 'bar.js')를 호출하면 노드는 다음 위치에서이 순서대로 찾습니다.

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

따라서 프로젝트 디렉토리에 node_modules 폴더를 넣고 원하는 모듈을 넣으십시오. 평상시처럼 그들을 요구하십시오. 노드가 프로젝트 폴더에서 node_modules 디렉토리를 찾지 못하면 자동으로 상위 폴더를 확인합니다. 따라서 다음과 같이 디렉토리 구조를 만드십시오.

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

따라서 이와 같이 하위 프로젝트의 종속성도 기본 node_modules 저장소에 그릴 수 있습니다.

이 방법의 한 가지 단점은 package.json 파일을 수동으로 빌드해야한다는 것입니다 (누군가가 grunt 등으로이를 자동화하는 방법을 알지 않는 한). 패키지를 설치하고 npm install명령에 --save arg를 추가하면 종속성 섹션 또는 package.json에 자동으로 추가되므로 편리합니다.


3
왜 이것이 답변 작업으로 허용되지 않습니까? @tpie에 대한 추가 질문, 제안한 프로젝트를 구성하는 경우 부모 모듈 저장소에서 설치할 package.json을 어떻게 빌드할까요?
diehell

@diehell 그래서 그것은 "모두 또는 아무것도"인 것 같습니다. 모든 또는 종속성이 상위 디렉토리에 있고 CWD에 node_modules 디렉토리가없는 경우 npm은 상위 디렉토리를 확인하고 찾으면 설치합니다. node_modules 폴더를 디렉토리에 넣으면 거기에 설치됩니다.
tpie

4
공유 node_modules가 다른 패키지 버전을 처리 할 수있는 방법을 알지 못합니다. node_modules의 패키지는 c : \ users (Windows)의 npm-cache와 달리 버전이 지정되지 않습니다.
cyberguest

npm 스크립트 및 package.json 파일을 작성할 때 패러다임을 어떻게 수정합니까?
Maddocks

18

트릭을 찾았습니다 . Windows 또는 Linux 에서 Symbolic Links (symlinks)를 살펴보면 바로 가기처럼 작동하지만 더 강력합니다.

간단하게 당신이 할 필요가 Junction당신을 위해 node_modules당신이 원하는 폴더 어디서나. 접합은 원래 node_modules 폴더에 대한 지름길 일뿐입니다. 실제 node_modules가 사용 된 경우 생성되었을 프로젝트 폴더 내에 생성합니다 npm install.

이를 위해서는 적어도 하나의 node_modules실제 폴더 가 필요하며 다른 프로젝트에서 접합을 만드십시오.

Windows에서는 명령 프롬프트를 사용하거나 응용 프로그램을 사용할 수 있습니다. 명령 프롬프트를 사용하면 좀 더 제어 할 수 있으며 응용 프로그램을 사용하는 것이 더 쉽습니다 . Link Shell Extension을 제안 합니다.


1
타겟 디렉토리로 cd하고 다음 명령을 실행합니다 mklink /d node_modules (source dir)\node_modules..
ChrisTorng

1
우리 팀은 지금까지이 방법을 사용하고 있습니다. 나는 node_modules프로젝트 폴더 자체가 없다는 것을 정말로 경멸하지만 이것은 작동합니다. 그냥 실제를 찾아 기억 해 node_modules새로운 것을 설치하기 전에 폴더 : P
앤드류 Craswell

이 방법은 나를 위해 작동하지 않는 것 같습니다. 기호 또는 접합을 사용할 때 node-sass : Module build failed : "Error : Module did not self-register"오류가 발생하고 오류에 "shared"node_modules 디렉토리가있는 디렉토리를 지정하는 추가 세부 사항이 있습니다. 어떤 아이디어?
flipcode aug

1
npm install"연결된"앱에서 실행할 때 종속성 정리를 피하는 방법은 무엇입니까?
Qwerty

1
하지만 npm install <new-package>현재 프로젝트의 package.json에없는 모든 패키지를 실행 하면 제거됩니다.
Rohit Kaushal

17

npm 대신 pnpm 을 사용해보십시오 .

pnpm은 하드 링크와 심볼릭 링크를 사용하여 모듈의 한 버전을 디스크에 한 번만 저장합니다.

다음으로 설치 :

npm install -g pnpm

기존 설치 (및 하위 디렉토리)를 업데이트하려면 다음을 사용하십시오.

pnpm recursive install

8

기본 디렉토리는 다음과 같아야합니다.

node_modules
Project 1
Project 2
Project 3
Project 4

그냥 파일을 열어 Project 1/.angular-cli.json

스키마 변경

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

...에

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

node_modules프로젝트 디렉토리 안에 빈 폴더 를 만드는 것을 잊지 마십시오


너는 나의 영웅이야. 나는 이것에 일주일 을 보냈다 . 정말 고맙습니다!!
Eliezer Berlin

5

일부 기사를 살펴보면 Lerna 는 단일 디렉토리 ( monorepo) 내에서 여러 프로젝트를 관리하는 데 좋은 도구 인 것 같습니다 . 모든 폴더의 전체 패키지를 복제하지 않고 모듈 공유를 지원하고 여러 프로젝트에 설치하도록 명령합니다.

pnpm 은 또한 다른 프로젝트를 위해 이미 설치된 모듈을 복제하지 않는 간단하고 효율적인 도구입니다.



0

단일 node_modules가 모든 응용 프로그램에 대한 모든 패키지를 포함해야한다고 가정 해 보겠습니다. 따라서 앱은 대부분의 고유 한 package.json 항목을 공유합니다 (이름 만 변경해야 함).

내 생각은 아래와 같이 단일 루트와 여러 src 수준을 갖는 것입니다.

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

직면 할 수있는 유일한 문제는 모든 앱에 대한 json (또는 tsconfig)의 백업을 갖고 작업 할 때 복원하거나 모든 앱을 제공하도록 시작 스크립트를 설정하는 것입니다.

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