개발관련/other

npm package.json 파일의 종속성, devDependencies 및 peerDependencies의 차이점

Rateye 2021. 12. 10. 10:20
728x90
반응형
질문 : npm package.json 파일의 종속성, devDependencies 및 peerDependencies의 차이점은 무엇입니까?

이 문서는 내 질문에 대한 답이 매우 부족합니다. 나는 그 설명을 이해하지 못했습니다. 누군가 더 간단한 말로 말할 수 있습니까? 간단한 단어를 고르기가 어렵다면 예를 들어 보시겠습니까?

EDIT 는 또한 밀접하게 관련되어 혼란을 일으킬 수있는 peerDependencies

답변

중요한 동작 차이 요약 :

  • dependencies 은 둘 다에 설치됩니다.
    • package.json 이 포함 된 디렉토리에서 npm install
    • npm은 다른 디렉토리에 npm install $package
  • devDependencies 는 다음과 같습니다.
    • --production 플래그를 전달하지 않는 한 package.json 을 포함하는 디렉토리 npm install 에도 설치됩니다 (Gayan Charith의 답변에 찬성 투표 ).
    • npm에 설치되지 않음 --dev 옵션을 지정하지 않는 한 다른 디렉토리에 npm install "$package"
    • 전 이적으로 설치되지 않습니다.
  • peerDependencies :
    • 3.0 이전 : 누락 된 경우 항상 설치되고 서로 다른 종속성에서 호환되지 않는 여러 버전의 종속성을 사용할 경우 오류가 발생합니다.
    • 3.0에서 시작할 것으로 예상 됨 (예상 npm install 누락 된 경우 경고를 표시하고 수동으로 종속성을 해결해야합니다. 실행할 때 종속성이 없으면 오류가 발생합니다 ( @nextgentech에서 언급 함).
    • 버전 7 에서는 자동으로 해결할 수없는 업스트림 종속성 충돌이 없으면 peerDependencies가 자동으로 설치됩니다.
  • Transitivity (Ben Hutchison에 의해 언급 됨) :
    • dependencies 은 전 이적으로 설치됩니다. A에 B가 필요하고 B에 C가 필요하면 C가 설치되고, 그렇지 않으면 B가 작동하지 않고 A도 작동하지 않습니다.
    • devDependencies 는 전 이적으로 설치되지 않습니다. 예를 들어 A를 테스트하기 위해 B를 테스트 할 필요가 없으므로 B의 테스트 종속성을 생략 할 수 있습니다.

 

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

 

devDependencies

dependencies 은 실행에 필요하며 devDependencies 는 개발에만 필요합니다. 예 : 단위 테스트, 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/

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

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

예를 들어 dependency1dependency2 피어가 dependency3 경우 프로젝트 트리는 다음과 같습니다.

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

package.json 파일에서 dependency3 을 언급하지 않은 경우에도 발생합니다.

나는 이것이 Inversion of Control 디자인 패턴의 예라고 생각합니다.

피어 종속성의 전형적인 예는 Grunt, 호스트 및 해당 플러그인입니다.

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

  • gruntpeer-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.
출처 : https://stackoverflow.com/questions/18875674/whats-the-difference-between-dependencies-devdependencies-and-peerdependencies
728x90
반응형