Yarn: 개발 / 테스트를 위해 패키지 피어 종속성을 설치하는 수단 추가

에 만든 2016년 10월 27일  ·  72코멘트  ·  출처: yarnpkg/yarn

_feature_를 요청하거나 _bug_를 신고 하시겠습니까?
특색

현재 행동은 무엇입니까?
N / A

예상되는 동작은 무엇입니까?
package.json 지정된 피어 종속성을 설치하는 CLI 명령 yarn install --peer 을 제공합니다. 이런 식으로 개발 / 테스트는 react / ng2 / grunt와 같은 피어를 사용할 수 있습니다.

cat-feature help wanted triaged

가장 유용한 댓글

+1 이것은 도서관 작성자에게 중요합니다.

모든 72 댓글

@ jpollard-cs 저는 패키지를 피어 종속성으로 추가하는 것이 아니라 현재 피어 종속성으로 나열된 모든 패키지를 설치할 수있는 수단이 있음을 의미합니다.
그렇지 않으면 플러그인을 개발할 수있는 실용적인 수단이 없습니다.

npm install
package.json 종속성 섹션에 선언 된 모든 패키지를 설치합니다.

yarn add --peer
나는 이것이 package.json peerDependencies 섹션에 선언 된 모든 패키지를 설치할 것으로 예상했습니다.

peerDependencies에 선언 된 패키지를 설치하는 방법이 있습니까?

내 사용 사례는 반응 네이티브 모듈의 개발 / 테스트입니다.

종료 된 NPM 문제는 다음과 같습니다. https://github.com/npm/npm/issues/11213

NPM 개발자에게는 중요하지 않은 것 같습니다.

+1 이것은 도서관 작성자에게 중요합니다.

나는 이미 NPM 문제에 대해 이것을 썼지 만 Yarn 사람들을 위해 :

패키지의 피어 종속성을 설치하는 cli 프로그램을 작성했습니다.

# If you're using npm
npm install -g install-peerdeps

# If you're using yarn
yarn global add install-peerdeps

cd my-project-directory

install-peerdeps <package>[@<version>]

# for example
install-peerdeps @angular/core
# will install all of angular's peerdeps

문제가 있으면 repo에서 이슈를 열어주세요!

@nathanhleung , 해당 패키지는 모든 종속성 피어 종속성을 설치하는 것으로 보입니다. 이 티켓에 대한 내용이 아닙니다. 이것은 자신의 패키지의 피어 종속성 설치에 관한 것입니다.

https://www.npmjs.com/package/@team-griffin/install -self-peers를 수행하기 위해 패키지로 수정했습니다.

@nathanhleung 당신은 바위입니다.

흠 ... 개발 / 테스트를 위해 종속성이 필요한 경우 devDependencies 아래에두면 안됩니까? 폭탄을 떨어 뜨리려하지 않고 ...

@nikolakanacki 당신이 어디에서 안되기 때문에 피어 종속성과 개발자 종속성이 모두 있다는 것입니다. 나는 동료를 쉽게 설치할 수 있도록 투표합니다!

@nikolakanacki 사용자가 설치하는 다른 패키지에 의존하는 패키지를 작성하는 경우

사용 사례 eslint-find-rules

패키지는 구성에 구성되지 않은 ESLint에서 사용 가능한 규칙을 찾습니다.
사용자가 이해하기 위해서는 패키지와 함께 제공되는 특정 버전 (또는 latest )이 아니라 설치 한 ESLint 패키지를 확인해야합니다.
따라서 peer 종속성입니다.

이제 프로젝트에 기여하고 싶다면 ESLint를 설치하는 더미 프로젝트로 npm 링크를 수행하지 않고도 코드를 테스트 할 수 있도록 ESLint를 node_modules에 설치하고 싶습니다.

사용자가 yarn 실행할 때 시스템은 피어 deps를 설치하지 않고 누락되었음을 경고해야합니다 (작동 함).

따라서 ... yarn install peer deps가 아직 설치되지 않은 경우 해당 문제를 친절하게 해결하는 플래그가 있습니다.

흥미로운 점

  • yarn add <package> --peer 은 node_modules에 설치하고 package.json에 추가합니다.
  • yarn add <other_package> 이후 node_modules에서 설치된 패키지를 제거합니다.

나는 현재 @nikolakanacki 모델을 따르고 dependencies , devDependenciespeerDependencies 을 (를) 설치하는 데 yarn install --peer 를 선호하지만 이는 나에게도 잘 작동합니다.

@kyleholzinger / @gaastonsr 이 맞다 개발 모드에서 peerDependencies 를 설치하지 않을 것입니다 ( cd -ed를 peerDependencies 있는 repo / 패키지에

명확히하기 위해 : 당신은 설치 eslint-find-rules 당신이 필요로하는 것을 불평하는 eslint 종속 (그것의로 peerDependencyeslint-find-rules 그래서 지금 당신이 쉬운 방법을 원) 작업중인 peer 해당 종속성을 추가하는 방법 ( eslint-find-rules 에 따라 달라지는 현재 프로젝트)? "해결하고 새 종속성으로 추가 ( package.jsonyarn.lock ) 현재 종속성에 필요한 가장 일치하는 피어 종속성"과 같은 것입니까?

이것이 당신의 요점이라면 그것은 매우 유용 할 수 있습니다. 개발할 때 자동 설치를 언급하고 있다고 생각했습니다.

이 기능은 순수한 편의를 위해 도입 될 수 있습니다. 예를 들어 여러 종속성이 피어 대상의 동일한 패키지에 의존 할 수 있지만 다른 버전이 필요합니다.이 기능은 단일 최고로 해결하려고 시도하여 최대한 활용할 수 있습니다. -일치하는 대상 (가능한 경우).

확실히 생각해야 할 것.

이것이 당신의 요점이라면 그것은 매우 유용 할 수 있습니다. 개발할 때 자동 설치를 언급하고 있다고 생각했습니다.

이것이 제가 찾고있는 것입니다. 패키지를 개발할 때 peerDependencies 설치.

네, 정확히 @nikolakanacki! 저는 우리가 사람들의 동료 관리 업무를 도울 수있는 좋은 기회가 있다고 생각합니다.

@gaastonsr 은 그것을 devDependencies 에 추가해야합니다-그것은 그렇게 간단합니다. 그렇지 않으면 개발을 위해 패키지가 손상되었습니다. 프로젝트를 복제하고 yarn 를 실행하면 모든 것이 설치되고 테스트 등을 실행할 수 있어야합니다.

다음과 같은 경우 종속성을 설치하기 전에 두 가지 간단하고 완전히 관련이없는 질문을해야합니다.

  1. 내 패키지는이 패키지에 종속되지만 내 패키지는 해당 패키지의 플러그인 일 뿐이므로 대상 프로젝트에 포함 할 것으로 예상합니다. Put it in peerDependencies .
  2. 이 패키지에 의존하는 테스트가 있지만 어떤 이유로 든 dependencies 나열되어 있지 않습니다 (여기에 나열되어서는 안 됨). Put it in devDependencies .

즉, 개발 중에있을 것으로 예상되고 개발중인 패키지의 직접적인 종속성으로 나열되지 않은 모든 패키지는 devDependencies 있어야합니다. 중복은 문제가되지 않습니다. 문서 어디에도 이러한 경우 중복이 허용 / 장려되지 않는다고 명시되어 있지 않습니다.

@nikolakanacki 패키지 용 플러그인을 빌드 할 때 사용자가 설치 한 패키지 버전에 의존해야합니다. devDependency 로 추가하면 불가피하게 다른 버전을 설치하고 대신 사용됩니다. 사용자의 버전.

종속성을 * 로 정의하지 않는 한, Yarn은 어떻게 든 결정적이어야하며 우리 대신 사용자가 설치 한 패키지를 선호해야합니다.

현재는 그렇지 않습니다.

@alexilyaev 나는 @nikolakanacki가 peerDependency 및 devDependency로 모두 설치하는 것을 의미합니다 생각합니다.

이것은 우리가 둘 다 동기화를 유지해야하는 문제가 있습니다. 저에게는 지금은 잘 작동하지만 이상적이라고 생각하지 않습니다.

@alexilyaev peerDependency 선언 할 때 버전도 선언합니다. 대상 프로젝트에 정의한 버전을 충족하는 피어 종속성 버전이 설치되어 있지 않으면 yarn / npm 오류를보고합니다 (예 : 피어 종속성 누락).

devDependency 는 그것과 아무 관련이 없습니다. 소스 패키지 내에서 yarn 또는 npm install 실행할 때 설치되는 것입니다 (피어 종속성을 선언하는 것, 예를 들어 : 플러그인), 타사 패키지 / 프로젝트 (피어)에서 패키지를 사용하는 경우에도 참조되지 않습니다.

요점은이 모든 것이 얼마나 관련이 있는지 모르겠다는 것입니다.

동기화 상태를 유지하는 데 어려움이 있음을 알 수 있지만 bash / javascript / <whatever> 스크립트를 쉽게 작성할 수 있습니다.이 스크립트는 설치 후 단계로 확인할 수 있습니다. package.json

내가 말하려는 요점은 우리가 devDependencies 감정을 깨뜨 리거나 더 나쁘게 " yarn 또는 npm install 실행한다고해서 반드시 모든 이 패키지의 필수 종속성 "개념.

반면에 yarn 는이 문제에 대해 훨씬 더 엄격한 정책을 도입했으며, 달리 정의되지 않은 패키지를 dependencies 또는 devDependencies 하여 실행하지 않습니다. 나중에 문제로.

@nikolakanacki 내 플러그인이 ^7.0.0 수락하고 최신 피어가 7.9.0 이고 사용자가 package.json 7.4.0 정의되어 있다고 가정 해 보겠습니다.
^7.0.0 에도 devDependencies 가있는 경우 Yarn이 사용자를 위해 7.9.07.4.0 둘 다 설치하지 않습니까?

만약 그렇다면, 내 플러그인 mistakingly 설치된 사용할 수있는 7.9.0 대신 7.4.0 .

@alexilyaev 패키지는 다른 경우의 다른 패키지와 마찬가지로 항상이 피어 dep에 대해 패키지에 정의 된 "semver 범위" 를 충족하는 가장 높은 사용 가능한 버전을 사용합니다.

좀 더 구체적으로 말씀 드리지만 귀하가 제시 한 사례를 잘 이해하지 못합니다. 설명해 주시겠습니까?

~ peerDependency 비 호환성, 플러그인은 ^7.0.0 , 버전 7.4.0 가 있음을 경고합니다. ~ 업데이트 : ^7.0.07.4.0 충족합니다.

Yarn은 7.9.0과 7.4.0을 모두 설치하지 않습니까?

Yarn은 peerDependencies 를 설치하지 않으며 dependencies 의 종속성 만 플러그인의 devDependencies 을 (를) 설치하지 않습니다.

@gaastonsr 당신은 ^7.0.07.4.0 의해 만족된다는 점을 제외하고는 절대적으로 맞습니다.

피어 종속성은 설치되지 않으며 패키지가 기본 패키지가 아닌 경우 기본적으로 개발 종속성이 설치되지 않습니다. "최종 사용자"는 범위와 함께 프로젝트의 일반 "종속성"에 추가하여 충족시키려는 피어 종속성을 정의해야합니다. 플러그인에서 필요한 "semver 범위"를 충족하거나 충족하지 않을 수 있으며 사용자에게 후자에 대한 알림이 표시됩니다.

npm에서 설명하는 Semver 범위 : https://docs.npmjs.com/misc/semver
의심스러운 경우 항상 확인 : http://jubianchi.github.io/semver-check/

@nikolakanacki

@nikolakanacki 좋습니다. 최종 사용자가 패키지를 설치할 때 devDependencies 는 설치되지 않으므로 패키지 작성자 devDependencies 에도 peerDependencies 를 추가 해야 합니다.

따라서 이것은 지역 개발 문제를 해결합니다.

그러나 많은 프로젝트에서 피어 종속성을 개발 종속성으로 추가하지 않은 것 같습니다.
그래서 저는 우리가 소문을 퍼 뜨리고 프로젝트에 참여해야한다고 생각합니다.
이것은 필연적으로 npm에서는 작동하지만 Yarn에서는 작동하지 않는 이유에 대한 긴 토론으로 이어질 것이며, 결과에 관계없이 시간이 걸리며 모든 프로젝트가 변경을 수행하는 것은 아닙니다.

그래서 ... 저는 여전히 피어 종속성을 설치하는 방법을 지원할 것을 제안하고 있습니다. 적어도 install-peerdeps 더 이상 사용할 필요가 없습니다.

여기서 실제 문제는 무엇입니까? 하나의 deps 목록을 설치하는 것이 다른 deps 목록을 설치하는 것보다 더 복잡하지 않은 것 같습니다. 동료 의존성은 몇 년 동안 존재했습니다. 이것이 누구를 괴롭히지 않았습니까?

@nikolakanacki 솔루션은 완벽합니다. 우리가 라이브러리 개발에 사용하고있는 것입니다. 격리 된 테스트 (필요한 peerDependencies 를 제공하는 호스트 프로젝트 외부)를 위해 라이브러리에 devDependencies 설정이 필요하고 통합 테스트 및 호스트를 확인하려면 peerDependencies 필요합니다. 프로젝트가 사용하는 라이브러리가 동일한 dependencies 하고 _ peerDependenciesdevDependencies 을 (를) 적절하게 사용 하지 않기 때문에 프로젝트가 중복 / 중복 된 패키지 설치로

동기화를 유지해야하는 작은 골칫거리가 있습니다. 그러나 @nikolakanacki가 지적했듯이 이것은 post-install 스크립팅을 통해 쉽게 완화 될 수 있습니다.

어떤 해결책?

나는 주석을 충분히 빠르게 검토했지만 간단한 해결책을 찾지 못했습니다.

peerDependencies가 최상위 패키지에있는 경우 항상 일반 종속성으로 설치하십시오.

개발 / 테스트 케이스에 완벽하게 맞으며 의존성으로 패키지 설치에 영향을주지 않습니다. yarn.lock에 대한 논리와 유사합니다. 추가 "개발"또는 어떤 모드가 필요하지 않습니다.

실제로 peerDependencies와 관련된 다른 실 버그로 인해 어떤 경우에는 정확히 어떻게 작동하는지 보입니다.

매우 동의합니다. repo에서 'yarn install'을 실행하면 deps에 아직 나열되지 않은 피어 종속성을 설치해야합니다. 그 점에서 개발 종속성과 어떻게 다른지 잘 모르겠습니다. 해당 모듈에서 개발하는 경우 이러한 모듈을 _ 필요한 __ 설치해야합니다.

문제가 무엇인지, 제안 된 해결책이있는 경우 무엇인지에 대한 명확한 그림을 얻을 수 없기 때문에 이것을 닫습니다.

설명과 함께 다시 열거 나 새 버그를 제출하십시오.

@BYK 당신이 당신에게 분명하지 않다는 이유만으로 55 개의 엄지 손가락과 34 개의 댓글로 문제를

매우 간단하다고 생각 합니다 .
또는 다른 방법으로 말하겠습니다. 현재 패키지에 설정된 경우 peerDependencies를 일반 종속성으로 취급하십시오 .

이 스레드에서 제안 된대로 피어 종속성을 dev 종속성으로 추가하면 흐름 유형이 중단됩니다. https://github.com/flowtype/flow-typed/issues/379

@andvgal 나는 단지 문제를 정리하려고 노력하고 있으며 몇 달 전의 모든 토론은 압도적이며 요약하기가 어려웠습니다.

매우 간단하다고 생각합니다. 최상위 패키지에 설정 될 때 peerDependencies가 설치되어 있는지 확인하십시오.
또는 다른 방법으로 말하겠습니다. 현재 패키지에 설정된 경우 peerDependencies를 일반 종속성으로 취급하십시오.

감사합니다. 문제를 다시 열지 만 그렇게하기로 결정했다면 기본적으로 peerDependencies를 설치하는 것의 의미에 대해 매우 신중하게 생각해야합니다.

또는-적어도-package.json 파일을 건드리지 않고 피어 종속성을 별도로 설치하는 방법을 제공하십시오. add를 사용하여 피어 종속성을 설치하는 경우 JSON 파일의 항목이 수정됩니다. 기본적으로 yarn이 쓰는 것과 다른 방식으로 semver 표현식을 설정했다면 변경됩니다.

--peer 스위치를 추가하여 설치하는 것은 괜찮다고 생각합니다.하지만 실제로는 이러한 모듈 중 일부를 링크하고 링크와 실제로 모듈 설치. npm을 사용하면 'npm i'. Yarn에서는 동등한 것을 볼 수 없습니다. 특히 package.json 파일을 수정하지 않고 package.json의 사양을 사용하여 하나의 파일을 설치할 수 있기를 원합니다.

@jimsugg , 저는 yarn add <package...> -p 사용하여 이미 package.json에 나열된 피어 종속성을 수동으로 설치했습니다. 이는 확실히 안티 패턴입니다. 피어 종속성은 개발 환경에 자동으로 설치되어야하는 것 같습니다 (사실 피어 종속성 인 경우 최소한 패키지를 요구하는 테스트가 있어야합니다).

나는 똑같은 것을 찾고 있었고 나열된 모든 피어 deps를 설치하기 위해이 Bash one-liner를 생각해 냈습니다 (jq가 설치되어 있어야 함) : yarn add $(jq -r '.peerDependencies|keys|join(" ")' package.json) .

다른 사람에게 도움이되기를 바랍니다.

@EdwardDrapkin 전설적인 아이디어에 감사드립니다! 나는 그것을 확장하고 이것을하기 위해 npm 스크립트를 추가했습니다.

"install:peers": "yarn add -P $(jq -r '.peerDependencies | to_entries | map(\"\\(.key)@\\(.value | tostring)\") | join(\" \")' package.json)",

peerDependencies 의 버전 사양도 유지합니다.;) latest 태그를 사용하지 않고 next 처럼 작업중인 다른 태그를 사용하고 싶지 않은 경우에만 문제가 발생합니다.

@shousper 여기에 jq 종속성이없는 방법이 있습니다.

node -e "const peers = Object.entries(require('./package.json').peerDependencies || {}).map(d => d.join('@')).join(' '); if (peers.length) process.stdout.write('yarn add -P --no-lockfile ' + String(peers));" | sh

Foo 에서 직접 작업 할 때 Foo 패키지의 피어 종속성을 설치하지 않으려는 시나리오가 있습니까? 나는 하나를 생각할 수 없다. 경우 Bar 사용하는 데 필요한 Foo 작업 할 때, 당신은 그것을 필요 Foo , 그것은 피어 의존성이기 때문에, 그것은 정규 종속 될 수 없습니다. 그런 다음 패키지에서 직접 작업 할 때만 설치해야하는데, 이것이 개발 종속성이하는 일입니다.

그렇기 때문에 얀이 peerDependencies를 devDependencies와 동일하게 처리하는 것이 합리적이라고 생각하지만 경고를 생성하는 지금 수행하는 작업도 수행합니다. 저는 일반적으로 모든 피어 종속성을 개발 종속성으로 만들기 때문에 중복을 줄일 수 있습니다.

그렇게하는 것이 문제가되는 이유가 있습니까? 아마도 브레이킹 체인지 일 것이므로 2.0까지 기다려야하지만 그 외에는 괜찮을 것 같습니다.

한 가지 문제는 피어 요구 사항보다 dev에 더 구체적인 버전을 설치하려는 것일 수 있습니다. 이 경우 devDependencies에서 복제하여 로컬 설치에 대한 피어 버전을 재정의 할 수 있어야합니다. 예를 들면

peerDepdency : react@^16.0.0
devDependency : react@~16.1.0

react의 로컬 설치를 ~ 16.1.0으로 제한하지만 모든 v16 버전을 피어 종속성으로 허용합니다. 나는 그런 것이 어디에 필요한지 완전히 확신하지 못하지만 유효하지 않은 것 같습니다.

@bdwain 동의합니다. 피어와 개발자 종속성의 차이점을 의미 론적으로 이해하지만 실제로는 똑같은 방식으로 설치됩니다. 모듈을 개발중인 경우 개발 및 피어 종속성을 모두 설치해야하며 모듈을 사용하는 경우 나열된 실제 종속성 만 설치해야합니다. 이 경우 install 명령에서 dev 및 peer 종속성이 다르게 작동하지 않는 이유를 알 수 없습니다.

@bdwain @kyleholzinger 저는 동의하지 않습니다. peerDependencies 는 의존성 설치의 실제 작업을 지시하는 것이 아니라 의존성의 필요성을 알리기위한 것이기 때문입니다.

이렇게하면 루트 / 최상위 패키지에도 존재하는 일시적 종속성 버전 문제가 자동으로 (그리고 잘못) 사용되지 않습니다. babel-core 를 예로 들어 보겠습니다.

Yarn의 맥락에서 지원이 부족한 점은 여기에 설명 된 것처럼 피어 및 개발 팀으로 정의 할 수있는 기능입니다.

즉, peer deps의 기본 설치 사양을 유지하고 더 나은 개발 경험을 제공하기 위해 .... yarn이 install 명령에 --include-peers 옵션을 도입 할 수 있습니까?

@hulkish 나는 감정에 동의하지만, 어떤 것을 피어 의존성으로 선언하고 싶지만 개발자 의존성으로 _not_하고 싶을 때 언제 예가 될까요?

특히 yarn을 사용하여 사용법을 올바르게 이해하면 피어 종속성 목록은 항상 dev 종속성의 하위 집합입니다. 이 경우 공식적으로 인정되어야하며 피어 종속성을 개발 종속성으로 선언 할 필요가 없다고 생각합니다.

내가 그것을 제기하는 유일한 이유는 개발 및 피어 종속성 모두를 추가하는 명령 / 옵션을 추가하는 것이 일반적으로 원사의 복잡성을 증가시키는 것처럼 느껴지고 여기 어딘가에 좋은 해결책이 있다고 생각하는 동안입니다. 간단하고 😄

안녕하세요.

@hulkish 나는 감정에 동의하지만, 어떤 것을 피어 의존성으로 선언하고 싶지만 개발 의존성으로 선언하고 싶을 때 언제 예가 될까요?

단위 테스트 또는 .build 실행에 필요하지 않을 때. 내 경험에 따르면 이것은 실제로 시작하기 위해 두 곳 모두에 추가해야 할 유일한 필요입니다.

여기서 해결책은 yarn이 자동 설치 피어를 허용하는 옵션을 도입하는 것입니다. peerDependencies 사용의 주요 이점은 호환되지 않는 일시적 종속성이 사용되는시기에 대한 비전을 얻는 것입니다. 여기서 핵심은 설치시 피어 deps의 기본 동작을 중단하지 않는 것입니다.

@hulkish 는 피어 종속성 중 하나를 가져 오기 위해 종속성의 종속성에 의존하는 시나리오에 대해 이야기하고 있다고 생각합니다. 그러나 전 이적 종속성이 여전히 피어 종속성에 의해 지정된 범위와 일치해야하므로 어쨌든 큰 범위 여야하므로 이것이 문제를 일으키지 않을 것이라고 생각합니다. 전이 종속성이 피어 종속성보다 더 구체적이면 해당 범위가 우선하고 모든 요구 사항이 여전히 충족됩니다.

단위 테스트 또는 .build 실행에 필요하지 않은 경우

완전히 잡아라! 그것이 질문을 불러 일으키지 만 : 무언가가 피어 종속성이지만 단위 테스트 또는 빌드를 실행하는 데 필요하지 않은 경우 왜 피어 종속성으로 사용합니까?


peerDependencies 사용의 주요 이점은 호환되지 않는 일시적 종속성이 사용되는시기에 대한 비전을 얻는 것입니다.

이것에 강력히 동의합니다. 저는 피어 종속성이있는 라이브러리에 대한 종속성을 선언하는 모듈의 소비자로부터 피어 종속성이 놀랍다 고 생각합니다. 필자의 주요 불만 사항은 피어 종속성이있는 모듈을 개발할 때입니다. 혼란이 있다면 죄송합니다!

내 주요 요청 / 제안 / 희망-취득-승인-작업-은 자신의 package.json 피어 종속성이있는 모듈에서 yarn install (프로덕션이 아님) package.json 는 개발 종속성과 피어 종속성이 모두 설치됩니다. 이것이 주요 차이점입니다. 지금은 dev 종속성 만 설치되므로 deps를 dev 종속성 및 피어 종속성으로 선언해야합니다.


트윗 담아 가기

@hulkish 는 피어 종속성 중 하나를 가져 오기 위해 종속성의 종속성에 의존하는 시나리오에 대해 이야기하고 있다고 생각합니다.

저는 특히 피어 종속성이있는 모듈을 다른 프로젝트에 추가 할 때가 아니라 피어 종속성이있는 모듈을 개발할 때 yarn install 를 수행 할 때에 대해 이야기하고 있습니다.

@bdwain 정확히는 아니지만 설명

문제가있는 사용 사례

이것이 최상위 패키지라고 가정 해 봅시다.

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

그런 다음 foo / package.json :

  "dependencies": {
    "react": "^16.0.0"
  }

이 종속성 트리에 따라 yarn / npm install을 실행할 때 node_modules 디렉토리는 다음과 같습니다.

node_modules/
  react/ <-- @^15.0.0
  foo/node_modules/react/ <-- @^16.0.0

이 시점에서 (어떤 이유에서든) 자발적으로 node_modules 중첩 dir 구조를 검사하기로 결정하지 않는 한-문제가 있다는 것을 결코 알 수 없습니다. 이것은 패키지 관리자의 결함이 아닙니다. 작업을 정확하게 완료했습니다.

따라서 peerDependencies는 설치 지침이 아닌 유효성 검사로 처리하여이 사용 사례를 해결하기위한 것입니다.

peerDependencies 솔루션의 사용 사례

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

그런 다음 foo / package.json :

  "peetDependencies": {
    "react": "^16.0.0"
  }

먼저,이 시점에서 두 사용 사례 모두 반응 버전이 서로 호환되지 않는

이 사용 사례의 차이점은 다음과 같습니다. 이 문제 대신 조용히 존재합니다. npm / yarn install을 실행할 때 패키지 관리자는 비 호환성을 오류 또는 경고로보고 할 의무가 있습니다.

이것이 더 잘 설명되기를 바랍니다.

안녕하세요.

나는 특히 다른 프로젝트에 피어 종속성이있는 모듈을 추가 할 때가 아니라 피어 종속성이있는 모듈을 개발할 때 yarn 설치를 수행 할 때에 대해 이야기하고 있습니다.

이해 했어요. 피어 dep의 기본 동작은 그대로 유지되어야한다고 생각합니다. 그러나 쉬운 해결책은 cli 및 / 또는 env vars 및 / 또는 .yarnrc 를 통해 구성 할 수 있도록하는 것입니다. --install-peers-as-dev

그러나 쉬운 해결책은 cli 및 / 또는 env vars 및 / 또는 .yarnrc를 통해 구성 할 수 있도록하는 것입니다. --install-peers-as-dev와 같은 것

당근 빠따 지! 나는 개인적으로 그들이 개발 의존성과 동료 의존성에 둘 다 있어서는 안된다고 생각하지만, 그것은 별도의 논의가 될 수 있습니다. 나는이 옵션을 추가하는 것이 확실한 타협이 될 것이고 그 동안 문제를 해결하는 좋은 방법이 될 것이라고 생각한다. 나는 그것을 확인하고 무언가를 함께 던지려고 노력할 것이다. :)

@kyleholzinger https://github.com/yarnpkg/yarn/blob/master/src/cli/commands/install.js#L58 시작하기에 좋은 곳입니다.

또한 귀하의 홍보에서 peerDependencies가 dev로 설치되도록 전달하는 동안 호환성 경고 또는 오류가 계속보고되는지 확인하기를 원합니다.

@hulkish 피어 종속성이 무엇인지 이해합니다. 내 요점은 실제로 개발 목적으로 항상 설치해야하므로 버전이 일치하지 않을 때 경고를 제공하는 역할 외에도 devDependencies로 취급해야한다는 것입니다.

패키지 Foo에 Bar에 대한 피어 종속성이있는 경우 Foo에서 직접 작업 할 때 Bar를 설치하지 않을 유일한 시나리오는 빌드 및 자동화 된 테스트에 Bar가 필요하지 않은 경우입니다. 하지만 그럴 경우 빌드 / 테스트가 처음에 Bar에 대한 피어 종속성을 요구하는 기능을 실행하지 않았 음을 의미하며, 이는 일반적인 경우가 아닙니다.

필자는 피어 종속성의 자동 설치를 활성화하는 옵션이 더 자주 필요하기 때문에 올바른 일이라고 생각하지 않습니다 (피어를 dev 종속성으로 지정하지 않는 한). 옵션이 자주 필요하지 않은 경우 기본값이어야하며 대신 비활성화 할 수있는 옵션이 있어야합니다. yarn install 은 (는) 가장 일반적인 경우 옵션없이 작동해야하며, 개발 종속성으로 처리 할 피어 종속성이 가장 일반적인 경우입니다. 일반 사용자에게 추가 단계를 추가하는 것은 더 나쁜 경험입니다.

그리고 그것들을 dev와 peer 모두에 자동으로 추가하는 것은 여전히 ​​두 곳에서 종속성을 복제하는 문제가 있습니다. IMO는 문제이며 필요하지 않아야합니다.

어느 쪽이든 이러한 경고 / 오류를보고해야합니다.

아직이 기능이없는 것이 어떻게 가능합니까? npm 패키지를 처음 만들었지 만 npm 패키지 개발의 핵심 워크 플로의 일부인 것 같습니다.

같은 @biels! 저는 실제로 제가이 작업을 할 것이라고 말한 것을 완전히 잊었으므로 아직 시작하지 않았습니다. 가능할 때 작업을 시도 할 것입니다. 그러면 적어도 사람들이이 옵션을 .yarnrc 넣도록 할 수 있습니다. 항상 그것에 대해 걱정할 필요가 없습니다

이 기능은 매우 중요하다고 생각합니다.

특히 도서관 저자의 경우 많은 사용 사례를 생각할 수 있습니다.

reactreact-dompeerDependencies 포함하는 구성 요소 라이브러리를 개발하고 싶다고 가정 해 보겠습니다 (결국 사용하는 사람이이 라이브러리를 번들로 묶는 것을 원하지 않습니다. 이 두 라이브러리는 이전에 경험 한 문제를 일으킬 수 있습니다.)

peerDependencies 설치된 구성 요소 라이브러리를 테스트하고 싶습니다. 그래서 yarn --include-peerDeps (또는 이와 유사한 것)를 CI 및 내 컴퓨터에서 실행하고 싶지만 누군가 yarn 실행할 때 자신의 패키지에 reactreact-dom 종속성을 사용하여 테스트를 실행하기를 원합니다 (어떻게 수행하든 상관 없습니다).

나는 또한 우리가 정확하게 이것을 수행하고 많은 다운로드를 가지고있는 모듈을 가지고 있기 때문에 이미이 기능을 네이티브로 만드는 것을 정당화한다고 생각합니다. ( "사람들이 원하는 것을 만든다"라는 옛 모토가 여기에 적용됩니다. IMO)

--include-peerDeps 통해 명시 적으로 토글해야하므로 이것이 어떻게 나쁜 습관이 될 수 있는지 알 수 없습니다.

필요한 경우 구현에 대해 논의하고 도움을 드리겠습니다.

@lucasfcosta 는 더 이상 동의 할 수 없습니다! 요즘 작업 할 시간이 많지 않기 때문에 할 수있을 때 주위를 훑어 보려고했지만 명령 줄 옵션에서 옵션을 사실대로 얻을 수없는 것 같습니다. 그래도 도움의 손길을 좋아할 것입니다 :)

@lucasfcosta 여기 에 옵션이 살 수 있다고 생각한 위치에 대한

저는 현재 중복 접근 방식 (devDependencies 및 peerDependencies)을 사용하고 있지만이 기능을 매우 좋아하므로 그만 둘 수 있습니다.

저도 필요합니다. 그동안 나는 작은 노드 작업을 수행했습니다

const pkg = require('./package.json');
const entries = Object.entries(pkg.peerDependencies);
const shell = require('shelljs');

let deps = ['yarn add'];
for ([dep, version] of entries) {
    deps[deps.length] = `${dep}@${version}`;
}

deps.push('--peer');
const cmd = deps.join(' ');
console.log('Installing peer deps!\n -----', cmd);
const result = shell.exec(cmd);

if (result.code !== 0) {
    shell.echo('Error: installing peer dependencies');
    shell.exit(1);
}

멋있는! 이제 원사에 붙여넣고 깃발 등을 추가 할 수 있습니다.

2018 년 10 월 4 일 목요일 17:29 Pasquale Mangialavori [email protected]
썼다 :

저도 필요합니다. 그동안 나는 작은 노드 작업을 수행했습니다

`const pkg = require ( './ package.json');
const 항목 = Object.entries (pkg.peerDependencies);
const 쉘 = require ( 'shelljs');

let deps = [ 'yarn add'];
for ([dep, version] of items) {
deps [deps.length] = $ {dep} @ $ {version};
}

deps.push ( '-peer');
const cmd = deps.join ( '');
console.log ( 'Peer deps 설치 중! n -----', cmd);
const 결과 = shell.exec (cmd);

if (result.code! == 0) {
shell.echo ( '오류 : 피어 종속성 설치');
shell.exit (1);
}`


당신이 언급 되었기 때문에 이것을 받고 있습니다.
이 이메일에 직접 답장하고 GitHub에서 확인하세요.
https://github.com/yarnpkg/yarn/issues/1503#issuecomment-427063046 또는 음소거

https://github.com/notifications/unsubscribe-auth/AE64MGxna2iQ-BFNiC52mIVro8sydPu1ks5uhilsgaJpZM4KiMuo
.

나는 또한 @RWOverdijk가 말한 것처럼 복제 접근 방식을

Btw, 우리가 하나의 패키지를 두 번 (devDependencies 및 peerDependencies) 추가 할 필요가 없도록 더 나은 솔루션이있는 사람이 있습니까?

안녕하세요. 이것은 패키지 / lib 개발자에게 여전히 문제입니다. 중복 deps가 답이되어서는 안됩니다.

이 기능이 추가 되었으면합니다. 패키지의 devDependencies react 를 추가하지 않으면 코드에서 테스트를 실행할 수 없습니다.

로컬 peerDependencies 개체에 패키지를 설치하는 플래그는 좋지만 _only_ local peerDependencies 설치를 기본 동작으로 만드는 _any_ 단점도 볼 수 없습니다. 그리고 의미 적으로는 의미가 있습니다. 패키지가 다른 곳에서 작동하려면 피어 종속성이 있어야합니다. 로컬에서 다른 이유는 무엇입니까?

플래그 사용에 대한 내 의견은 다음과 같습니다.
yarn add --peer 명령.

yarn --peer
# and
yarn install --peer

최소한 플래그는 도입되어야합니다.

별도의 test 앱을 사용하는 것이 여기서 좋은 해결책인지 궁금합니다. 그런 다음 모두를 추가 할 수 있습니다 당신의 peerDependenciesdependenciestest 응용 프로그램. 이것은 다음을 수행하는 것 같습니다.

  • 유지 peerDependencies 아웃 devDependencies 라이브러리에
  • 당신은 e2e에서 당신의 라이브러리를 테스트하게 될 것입니다. 당신의 dist가 제대로 구축되었는지 확인하고, 모든 컴포넌트를 올바르게 내보내고 있습니다.
  • "my-package": "file:/path/to/my-package" 와 같은 로컬 종속성을 사용할 때 패키지에서 node_modules 를 지우는 것을 잊었을 때 가끔 발생하는 Invalid hook call 오류를 방지합니다.

더 많은 정보가 사람들에게 도움이된다면이 접근 방식을 모델링하고 문제를 문서화하기 위해 데모 저장소를 만들었습니다.
https://github.com/jamstooks/package-peer-dependencies

지금은 npx install-peerdeps <package> 를 실행할 수 있어야하며 CLI는 폴더에 yarn lock 등이있는 경우 설치에 Yarn을 사용할 것인지 묻습니다. 적어도 지금은 저에게 효과적이었습니다.

이 NPM RFC에서 Arcanis ( "누락 된 피어 deps에서 설치 실패")와 Isaac ( "자동으로 피어 deps 설치")의 추가 논의 :

https://github.com/npm/rfcs/pull/43

이 블로그 게시물은이 문제를 해결하는 데 도움이되었습니다 : https://dev.to/yvonnickfrin/how-to-handle-peer-dependencies-when-developing-modules-18fa

제 생각에 관련 문제가 있습니다.
최소한의 재현을 위해 다음과 같은 종속성 목록이 있습니다.

  "dependencies": {
    "prismic-reactjs": "^1.2.0"
  },
  "peerDependencies": {
    "react": "^16.12.0"
  },
  "devDependencies": {
    "react": "^16.12.0",
    "redux": "^4.0.5"
  }

설명 : 내 패키지는 런타임에 react 존재에 의존하며 테스트에도 필요합니다. redux 는 데모 용으로 여기에 있습니다. 아래를 참조하세요.

이제 prismic-reactjs 는 피어 종속성으로 react 에도 의존합니다.
yarn --production 가 호출되면 어떻게 되나요?

React는 _installed_ 및 _hoisted_입니다.
나는 둘 중 _ 아무도 _ 일어나지 않을 것으로 예상합니다.

데모 목적을 위해 여기에 redux 가 추가되어 설치되어 있지 않습니다. 이것은 일시적인 피어 종속성이 문제의 원인임을 증명합니다.

Repro 저장소 : https://github.com/emirotin/yarn-react-repro . 빠른 확인을 위해 test.sh 를 실행합니다.

npm은 이제 v7에서이 기능을 가지고 있습니다 ... 사에 이것을 추가하지 않는 이유는 무엇입니까?

내가 아는 한, @arcanis로 @sajadghawami이 일에 대해 꽤 큰 예약이 있습니다 :

https://github.com/npm/rfcs/pull/43#issuecomment -520584797

이 페이지가 도움이 되었나요?
0 / 5 - 0 등급