[node.js] npm package.json 파일의 종속성, devDependencies 및 peerDependencies의 차이점은 무엇입니까?

이 문서는 내 질문에 매우 잘못 대답합니다. 나는 그 설명을 이해하지 못했습니다. 누군가 더 간단한 말로 말할 수 있습니까? 간단한 단어를 선택하기 어려운 경우를 예로들 수 있습니다.

EDIT 도 추가되었습니다 peerDependencies.이 기능은 밀접하게 관련되어 있으며 혼동을 일으킬 수 있습니다.



답변

중요한 행동 차이 요약 :

  • dependencies 둘 다에 설치됩니다 :

    • npm install 포함 된 디렉토리에서 package.json
    • npm install $package 다른 디렉토리에
  • devDependencies 아르:

    • 또한 플래그 를 전달하지 않는 한 ( 가얀 카리스의 대답을 찬성하지 마십시오 ) npm install를 포함하는 디렉토리에 설치했습니다 .package.json--production
    • 옵션을 지정 npm install "$package"하지 않으면 다른 디렉토리에 설치되지 않습니다 --dev.
    • 전 이적으로 설치되지 않았습니다.
  • peerDependencies:

    • 3.0 이전 : 누락 된 경우 항상 설치되며, 호환되지 않는 여러 버전의 종속성이 다른 종속성에 의해 사용되는 경우 오류가 발생합니다.
    • 3.0에서 시작될 것으로 예상 됨 (예상치 않음) :에서 누락 된 경우 경고를 표시 npm install하고 직접 종속성을 해결해야합니다. 실행시 종속성이 없으면 오류가 발생합니다 ( @nextgentech에 의해 언급 )
  • 과도 성 ( Ben Hutchison ) :

    • dependencies A가 B를 요구하고 B가 C를 요구하면 C가 설치되고, 그렇지 않으면 B가 작동하지 않으며 A도 B가 작동하지 않습니다.

    • devDependencies전 이적으로 설치되지 않았습니다. 예를 들어 A를 테스트하기 위해 B를 테스트 할 필요가 없으므로 B의 테스트 종속성을 생략 할 수 있습니다.

여기서 논의되지 않은 관련 옵션 :

devDependencies

dependenciesdevDependencies단위 테스트, CoffeeScript에서 JavaScript 로의 변환, 축소 등을 개발하기 위해서만 실행해야합니다 .

패키지를 개발하려면 패키지를 다운로드하고 (예 :를 통해 git clone) 루트가있는 루트로 이동하여 package.json다음을 실행하십시오.

npm install

실제 소스가 있으므로이를 개발하려는 것이 분명하므로 기본적으로 dependencies(물론 개발을 위해 실행해야하므로) devDependency종속성도 설치됩니다.

그러나 패키지를 사용하기 위해 패키지를 설치하려는 최종 사용자 일 경우 모든 디렉토리에서 수행 할 수 있습니다.

npm install "$package"

이 경우 일반적으로 개발 종속성을 원하지 않으므로 패키지 사용에 필요한 것을 얻는 것입니다 dependencies.

이 경우 개발 패키지를 실제로 설치하려면 명령 행에서 다음과 같이 dev구성 옵션을로 설정하십시오 true.

npm install "$package" --dev

이 옵션은 false기본적으로 훨씬 덜 일반적인 경우이므로 기본적으로 사용됩니다.

peerDependencies

(3.0 이전에 테스트)

출처 : https://nodejs.org/en/blog/npm/peer-dependencies/

정기적 인 종속성을 사용하면 여러 버전의 종속성을 가질 수 있습니다. 종속성의 내부에 간단히 설치됩니다 node_modules.

예 경우 dependency1dependency2모두에 의존 dependency3프로젝트 트리 모양을 서로 다른 버전에서 :

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

그러나 플러그인은 일반적 으로이 컨텍스트 에서 호스트 라고하는 다른 패키지를 필요로하지 않는 패키지입니다 . 대신 :

  • 호스트 는 플러그인이 필요 합니다
  • 플러그인은 호스트가 찾을 것으로 예상되는 표준 인터페이스를 제공합니다
  • 호스트 만 사용자가 직접 호출하므로 단일 버전이어야합니다.

예를 들어 dependency1, dependency2피어가에 의존 dependency3하면 프로젝트 트리는 다음과 같습니다.

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

당신이 언급 적이 있지만이 경우에도 발생 dependency3당신의 package.json파일.

이것이 Inversion of Control 디자인 패턴 사례라고 생각합니다 .

피어 종속성의 프로토 타입 예제는 Grunt, 호스트 및 해당 플러그인입니다.

예를 들어 https://github.com/gruntjs/grunt-contrib-uglify 와 같은 Grunt 플러그인 에서 다음을 볼 수 있습니다.

  • grunt 이다 peer-dependency
  • 유일한 require('grunt')것은 밑에 있습니다 tests/: 그것은 실제로 프로그램에 의해 사용되지 않습니다.

그런 다음 사용자가 플러그인을 사용할 때 회선 Gruntfile을 추가 하여 플러그인을 암시 적으로 요구 grunt.loadNpmTasks('grunt-contrib-uglify')하지만 grunt사용자가 직접 호출합니다.

각 플러그인마다 다른 Grunt 버전이 필요한 경우에는 작동하지 않습니다.

설명서

문서가 질문에 잘 대답한다고 생각합니다. 아마도 노드 / 다른 패키지 관리자에 익숙하지 않을 수도 있습니다. Ruby 번 들러에 대해 조금 알고 있기 때문에 아마도 이해해야 할 것입니다.

핵심은 다음과 같습니다.

이러한 것들은 패키지의 루트에서 npm 링크 또는 npm 설치를 수행 할 때 설치되며 다른 npm 구성 매개 변수처럼 관리 할 수 ​​있습니다. 주제에 대한 자세한 내용은 npm-config (7)를 참조하십시오.

그런 다음 npm-config (7)에서 다음을 찾으십시오 dev.

Default: false
Type: Boolean

Install dev-dependencies along with packages.


답변

devDependencies를 설치하지 않으려면 npm install --production


답변

예를 들어, 모카는 일반적으로 devDependency가 될 것입니다. 프로덕션에서는 테스트가 필요하지 않지만 Express는 종속성입니다.


답변

의존성
코드에서 호출하는 함수를 제공하는 라이브러리와 같이 프로젝트를 실행해야하는 의존성 .
전 이적으로 설치됩니다 (A가 B에 의존하는 경우 C에 의존하는 경우 npm 설치는 A와 B를 설치합니다).
예 : lodash : 프로젝트가 lodash 함수를 호출합니다.

devDependencies
코드를 가져 와서 자바 스크립트, 테스트 프레임 워크 또는 문서 생성기로 컴파일하는 컴파일러와 같이 개발 또는 릴리스 중에 만 필요한 종속성.
전 이적으로 설치되지 않습니다 (A가 C에 따라 B 개발자에 의존하는 경우 A에 npm을 설치하면 B 만 설치됨).
예 : grunt : 프로젝트는 grunt를 사용하여 자체 빌드합니다.

peerDependencies
프로젝트가 상위 프로젝트에서 다른 라이브러리 또는 도구의 플러그인에 연결하거나 수정하는 종속성. 부모 프로젝트 (프로젝트에 의존 할 프로젝트)가 연결하는 프로젝트에 종속되어 있는지 확인하기위한 것입니다. 따라서 라이브러리 B에 기능을 추가하는 플러그인 C를 만드는 경우 프로젝트 A를 만드는 사람은 C에 대한 종속성이있는 경우 B에 대한 종속성이 있어야합니다.
설치되지 않은 경우 (npm <3이 아닌 경우) 확인했다.
예 : grunt : 프로젝트는 grunt에 기능을 추가하고 grunt를 사용하는 프로젝트에서만 사용할 수 있습니다.

이 문서는 피어 종속성을 잘 설명합니다 : https://nodejs.org/en/blog/npm/peer-dependencies/

또한 npm 설명서는 시간이 지남에 따라 개선되었으며 이제는 다양한 유형의 종속성에 대한 더 나은 설명이 있습니다. https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies


답변

패키지 를 dev. 종속성 으로 package.json에 저장하려면

npm install "$package" --save-dev

당신이 실행하면 npm install그것은 모두 설치됩니다 devDependencies하고 dependencies. 설치 devDependencies실행 을 피하려면 다음을 수행하십시오.

npm install --production


답변

개발에는 필요하지 않은 일부 모듈 및 패키지가 있으며 프로덕션에는 필요하지 않습니다. 설명서 에 나와있는 것처럼 :

누군가 자신의 프로그램에서 모듈을 다운로드하여 사용할 계획이라면 아마도 사용하는 외부 테스트 또는 문서 프레임 워크를 다운로드하거나 빌드하지 않아도됩니다. 이 경우 이러한 추가 항목을 devDependencies 해시에 나열하는 것이 가장 좋습니다.


답변

나에게 더 명확하게 한 간단한 설명은 다음과 같습니다.

앱을 배포 할 때 종속성이있는 모듈을 설치해야합니다. 그렇지 않으면 앱이 작동하지 않습니다. 해당 시스템에서 개발하지 않으므로 devDependencies의 모듈을 프로덕션 서버에 설치할 필요가 없습니다.
링크