program tip

중첩 된 종속성을`yarn`으로 재정의하려면 어떻게해야합니까?

radiobox 2020. 12. 1. 07:53
반응형

중첩 된 종속성을`yarn`으로 재정의하려면 어떻게해야합니까?


내 패키지에 이러한 종속성이있는 경우

{ "name": "my-package",
  "dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }

그리고 foobar패키지에는 이러한 종속성이 있습니다.

{ "name": "foobar",
  "dependencies": { "baz":"^2.0.0" }

의 가장 최근에 출시 된 버전은 baz입니다 2.1.0.의 첫 번째 실행 yarn은에 설치 baz@2.1.0됩니다 foobar/node_modules.

실이 baz@2.0.9패키지 를 사용하도록 강제하는 방법은 foobar무엇입니까?

내 이해는 이것이 사용 가능하다는 것입니다 npm shrinkwrap( 이 질문 ).


내 질문의 요약은 아마도 Yarn은 반복 가능하고 결정적인 설치를 생성하지만 해당 설치를 어떻게 사용자 정의합니까?


실제로 허용 할 버전이 지나치게 제한적인 하위 종속성이 있는 경우 yarn을 사용하여 재정의 있습니다. 원래 질문이 정확하지 않은 것처럼 들리지만 원래 질문 실제로 제가 답변을 원했던 질문 이었고 답변을 찾았으므로 여기에 후손을위한 것입니다.

socket.io 라이브러리를 사용하고 component-emitter있으며 종속성이 있습니다. 그러나 필요한 한 쌍의 버전이 있습니다. 이것은 내가 아무것도 변경하기 전에 yarn.lock 파일의 모습입니다.

component-emitter@1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"

component-emitter@1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe"

그래서 그것은 내 클라이언트 코드에 두 개의 컴포넌트 이미 터 사본을 포함하고있었습니다. 1.1.2와 1.2.0 (또는 현재의 1.2.1) 사이에 주요 변경 사항이없는 것처럼 보였습니다. 먼저 yarn.lock 파일을 변경해 보았습니다.

component-emitter@1.2.1, component-emitter@^1.2.1, component-emitter@1.1.2:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"

이것은 효과가 있었지만 파일에 자동 생성에 대한 경고가 있습니다. 즉, 추가하는 모든 단일 업데이트 또는 새 패키지가이 변경 사항에 영향을 미칩니다. 약간의 검색을 통해 yarn --flat옵션을 찾았으며 , 이는 전체 프로젝트에서 각 패키지 중 하나만 선택하도록 강요합니다. 이전 패키지와 최신 패키지 사이에 실제 비 호환성 사례가 있다고 확신하기 때문에 그것은 나에게 과도한 것처럼 보입니다. 클라이언트 코드에서 중복 패키지를 제거하여 다운로드 크기를 줄이고 싶었습니다. 여전히 개발 패키지가 모두 올바르게 작동하기를 바랍니다.

하지만 yarn --flat 문서 에서 package.json에 들어갈 수있는 "해상도"블록에 대한 참조를 찾았습니다.

"resolutions": {
  "package-a": "2.0.0",
  "package-b": "5.0.0",
  "package-c": "1.5.2"
}

그래서 저는 "component-emitter" : "1.2.1"package.json에 새로운 "해상도"블록을 넣어 보았습니다 . 그리고 실제로 그것을 필요로하는 모든 위치에 대해 component-emitter를 1.2.1로 평평하게했습니다. 그리고 이제 저는 제 클라이언트 코드에 단 하나의 복사본 만 있습니다.

업데이트 된 편집 : Yarn은 이제 1.0부터 공식적으로 위의 "해상도"블록을 지원 합니다. 그래서 그것을 사용하십시오.


이것은 이제 yarn의 선택적 버전 해결 기능으로 가능 합니다 .

프로젝트의 package.json에서 다음을 사용하십시오 resolutions.

  "resolutions": {
    "foobar/**/baz": "2.0.9"
  }

이는의 패키지 foobar(및 그 아래에있는 다른 모든 패키지) 버전을 재정 의하여 baz버전 2.0.9가되도록합니다.


@SomeCallMeTime대답 은 훌륭하며 우리는 한 달 동안 직장에서 해왔습니다.

불행하게도, 이것은 v0.24.x 더 이상부터 가능하지 않다 (즉, 참조 코멘트 ).

생성 된 잠금 파일을 주시 할 필요없이 해당 사용 사례를 처리하는 간단한 방법을 갖도록 RFC 제안과 함께 Github에 공개 된 PR 이 있습니다.

참고 URL : https://stackoverflow.com/questions/40226639/how-do-i-override-nested-dependencies-with-yarn

반응형