programing

플러그인에 대해 npm의 피어 종속성을 사용하는 이유는 무엇입니까?

telecom 2023. 5. 20. 10:06
반응형

플러그인에 대해 npm의 피어 종속성을 사용하는 이유는 무엇입니까?

예를 들어, Grunt 플러그인이 Grunt에 대한 의존성을 "peer dependencies"로 정의하는 이유는 무엇입니까?

플러그인이 Grunt-plug/node_modules의 자체 종속성으로 Grunt를 가질 수 없는 이유는 무엇입니까?

피어 종속성에 대한 설명은 다음과 같습니다. https://nodejs.org/en/blog/npm/peer-dependencies/

하지만 잘 모르겠어요.

저는 현재 그룬트 작업을 사용하여 소스 파일을 로컬 장치에서 제공되는 /dist/ 폴더에 빌드하는 앱 자이버 스테로이드와 함께 일하고 있습니다.저는 npm에 처음 와서 투덜거려서 무슨 일이 일어나고 있는지 완전히 이해하고 싶습니다.

내가 알기로는:

[rootfolder]/package.json은 npm에게 그것이 의존한다고 말합니다.grunt-steroids개발을 위한 npm 패키지:

  "devDependencies": {
    "grunt-steroids": "0.x"
  },

알겠습니다. [rootfolder]에서 npm install을 실행하면 종속성이 검색되고 [rootfolder]/node_modules/grunt-steroids에 grunt-steroids가 설치됩니다.

그런 다음 Npm은 [rootfolder]/node_modules/grunt-steroids/package를 읽습니다.설치할 수 있도록 jsongrunt-steroids자체 종속성:

"devDependencies": {
    "grunt-contrib-nodeunit": "0.3.0",
    "grunt": "0.4.4"
  },
"dependencies": {
    "wrench": "1.5.4",
    "chalk": "0.3.0",
    "xml2js": "0.4.1",
    "lodash": "2.4.1"
  },
"peerDependencies": {
    "grunt": "0.4.4",
    "grunt-contrib-copy": "0.5.0",
    "grunt-contrib-clean": "0.5.0",
    "grunt-contrib-concat": "0.4.0",
    "grunt-contrib-coffee": "0.10.1",
    "grunt-contrib-sass": "0.7.3",
    "grunt-extend-config": "0.9.2"
  },

종속성 패키지는 [rootfolder]/node_modules/grunt-steroids/node_modules에 설치되며 이는 논리적입니다.

"devDependencies"가 설치되지 않았습니다. 사용하려고 하는 npm 탐지에 의해 제어됩니다.grunt-steroids그리고 그것에 발전하지 않습니다.

하지만 "peer Dependencies"도 있습니다.

이들은 [rootfolder]/node_modules에 설치되어 있는데, 다른 그룬트 플러그인(또는 기타)과 충돌하지 않도록 [rootfolder]/node_modules/grunt-steroids/node_modules에 설치되어 있지 않은 이유를 이해할 수 없습니다.

TL;DR: peerDependencies는 노출되지 않은 "개인" 종속성과 달리 사용 코드에 노출된(그리고 사용될 것으로 예상되는) 종속성에 대한 것으로, 구현 세부 정보일 뿐입니다.

피어 종속성이 해결하는 문제

NPM의 모듈 시스템은 계층적입니다.단순한 시나리오의 큰 장점 중 하나는 npm 패키지를 설치할 때 패키지 자체의 종속성을 가져와 즉시 사용할 수 있다는 것입니다.

그러나 다음과 같은 경우에 문제가 발생합니다.

  • 프로젝트와 사용 중인 일부 모듈은 모두 다른 모듈에 의존합니다.
  • 세 모듈은 서로 대화해야 합니다.

예제

예를 들어 당신이 건물을 짓고 있다고 가정해 보겠습니다.YourCoolProject그리고 당신은 둘 다 사용하고 있습니다.JacksModule 1.0그리고.JillsModule 2.0그리고 그것을 가정해 보겠습니다.JacksModule또한 에 따라 다릅니다.JillsModule하지만 다른 버전에서는, 이렇게 말합니다.1.0두 버전이 맞지 않으면 문제가 없습니다.▁▁fact은▁the실.JacksModule 중입니다.JillsModule표면 아래는 구현 세부사항일 뿐입니다.번들링 중입니다.JillsModule두 번, 하지만 안정적인 소프트웨어를 처음부터 사용할 때는 적은 비용을 지불해야 합니다.

하지만 이제 만약에JacksModule에 대한 .JillsModule어떤 식으로든의 예를 받아들입니다.JillsClass예를 들면...다음을 생성할 때 발생하는 작업new JillsClass 전용 사용2.0를 서관의도에게 합니다. 그리고 그것을 전달합니다.jacksFunction모든 지옥이 탈출할 것입니다!다음과 같은 간단한 것들jillsObject instanceof JillsClass갑자기 돌아올 것입니다.falsejillsObject실제로는 다른 사람의 사례입니다. JillsClass,2.0판본

피어 종속성이 이 문제를 해결하는 방법

그들은 npm에게 말합니다.

저는 이 패키지가 필요하지만, 제 모듈의 일부 버전이 아닌 프로젝트의 일부 버전이 필요합니다.

npm은 패키지가 해당 종속성이 없거나 호환되지 않는 버전의 프로젝트에 설치되고 있음을 확인하면 설치 프로세스 중에 사용자에게 경고를 표시합니다.

피어 종속성을 언제 사용해야 합니까?

  • 다른 프로젝트에서 사용할 라이브러리를 구축할 때
  • 이 라이브러리는 다른 라이브러리를 사용하고 있습니다.
  • 사용자가 다른 라이브러리에서도 작업해야 합니다.

일반적인 시나리오는 더 큰 프레임워크를 위한 플러그인입니다.굴프, 그룬트, 바벨, 모카 등을 생각해 보세요.Gulp 플러그인을 작성하는 경우 해당 플러그인이 사용자의 개인 버전의 Gulp가 아닌 사용자의 프로젝트가 사용하는 것과 동일한 Gulp와 함께 작동하도록 해야 합니다.

저는 당신이 먼저 그 기사를 다시 읽는 것을 추천합니다.약간 혼란스럽지만 윈스턴 메일의 예를 보면 다음과 같은 이유에 대한 답을 알 수 있습니다.

예를 들어, 다음과 같이 가정해 보겠습니다.winston-mail@0.2.3된 시된"winston": "0.5.x" 그안에."dependencies"테스트된 최신 버전이기 때문에 개체를 참조하십시오.앱 개발자로서, 당신은 최신의 가장 좋은 것을 원하기 때문에, 당신은 최신 버전의winston그리고 의winston-mail그리고 그것들을 당신의 소포에 넣습니다.로 json.

{
  "dependencies": {  
    "winston": "0.6.2",  
    "winston-mail": "0.2.3"  
  }  
}

그러나 이제 npm 설치를 실행하면 다음과 같은 예기치 않은 종속성 그래프가 생성됩니다.

├── winston@0.6.2  
└─┬ winston-mail@0.2.3                
  └── winston@0.5.11

이 경우 패키지의 여러 버전이 있을 수 있으며, 이로 인해 몇 가지 문제가 발생할 수 있습니다.피어 종속성을 통해 npm 개발자는 사용자가 루트 폴더에 특정 모듈을 가지고 있는지 확인할 수 있습니다.그러나 패키지의 특정 버전을 설명하면 다른 버전을 사용하는 다른 패키지에 문제가 발생할 수 있다는 지적은 맞습니다.이 문제는 기사에 나와 있듯이 npm 개발자와 관련이 있습니다.

한 가지 조언: 일반적인 종속성과는 달리 동료 종속성 요구사항은 관대해야 합니다.피어 종속성을 특정 패치 버전으로 제한해서는 안 됩니다.

따라서 개발자는 semver를 따라 피어 종속성을 정의해야 합니다.GitHub에서 grunt-steroids 패키지에 대한 이슈를 열어야 합니다.

peerDependencies가능한 가장 간단한 예를 사용하여 설명:

{
  "name": "myPackage",
  "dependencies": {
    "foo": "^4.0.0",
    "react": "^15.0.0"
  }
}


{
  "name": "foo"
  "peerDependencies": {
    "react": "^16.0.0"
  }
}

버전 myPackage를 합니다.^15.0.0그리고.foo리액트와만 호환됩니다.^16.0.0.

피어 종속성이 설치되지 않았습니다.

언급URL : https://stackoverflow.com/questions/26737819/why-use-peer-dependencies-in-npm-for-plugins

반응형