programing

중첩된 NPM 종속성 버전을 재정의하려면 어떻게 해야 합니까?

newsource 2023. 5. 15. 21:56

중첩된 NPM 종속성 버전을 재정의하려면 어떻게 해야 합니까?

는 사하고싶다니습용▁the를 사용하고 싶습니다.grunt-contrib-jasmineNPM 패키지.그것은 다양한 의존성을 가지고 있습니다.종속성 그래프의 일부는 다음과 같습니다.

─┬ grunt-contrib-jasmine@0.4.1
 │ ├─┬ grunt-lib-phantomjs@0.2.0
 │ │ ├─┬ phantomjs@1.8.2-2

phantomjs이렇게 하면 Mac OS X에 올바르게 설치할 수 없습니다.이것은 최신 버전에서 수정되었습니다.

어떻게 해야 합니까?grunt-lib-phantomjs의 의최버사니다합용을 하는 것.phantomjs?

일부 추가 컨텍스트:

  • grunt-contrib-jasmine에서는 버전 버명으필로적요다니합시이가 명시적으로 합니다."~0.2.0"grunt-lib-phantomjs버전이 명시적으로 필요한 경우"~1.8.1"phantomjs.
  • 추가하기phantomjs영향은 . 두 되고 " 패지의종속대한없첫영습니다은향내째번다있두니습어전두버치모되설키에성▁to내다있'두니습어설치모▁both▁are되▁package패encies버▁and두▁my;"가 설치됩니다.grunt-contrib-jasmine는 여전히 이전 버전을 사용합니다(NPM과 함께 패키지를 설치할 때 종속성하나의 다른 버전을 사용하도록 지시할 수 있습니까? 참조).

종속성 또는 하위 종속성을 재정의하기 위해 npm 축소 랩 기능을 사용할 수 있습니다.

나는방이했다습니것을금에서 을 했습니다grunt우리의 프로젝트새로운 버전의 연결이 필요했습니다.2.7.3우리에게 문제를 일으키고 있었습니다.그래서 나는 이름이 붙은 파일을 만들었습니다.npm-shrinkwrap.json:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "grunt-contrib-connect@0.3.0",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

npm프로젝트에 대한 설치를 수행하는 동안 자동으로 픽업해야 합니다.

(참조: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/)

npm cli v8.3.0 (2021-12-09) 기준으로 package.json 필드를 사용하여 이 문제를 해결할 수 있습니다.스트리플링 전사의 답변에 설명된 바와 같이

예를 들어, 프로젝트는 다음과 같습니다.typescript4.6.2직접적인 개발 의존성으로서 그리고.awesome-typescript-loader 버전을 2.7typescript다음을 확인할 수 있습니다.npm 버을사다니합을 합니다.4.6.2typescript위해서awesome-typescript-loader:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "typescript": "~4.6.2",
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "$typescript"
    }
  }
}

당신이 않경지는우를 사용하지 typescript직접적인 개발 의존성으로서, 당신은 작성해야 합니다.4.6.2$typescriptoverrides섹션:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "~4.6.2"
    }
  }
}

최신 버전의 종속성을 사용하는 경우:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "latest"
    }
  }
}

저.overrides둘 다에 사용할 수 있습니다.dependencies그리고.devDependencies.


npm 버전 >5를 사용하지만 <8.3.0: 편집package-lock.json에서 라이브러리를 삭제합니다."requires"섹션을 구성하고 "의존성" 아래에 추가합니다.

예를 들어, 당신이 원하는 것은deglob사할패지를 glob 버전 키지버전3.2.11지금의 것 대신에열어보세요package-lock.json다음을 참조:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

제다한을 합니다."glob": "7.1.2","requires",더하다"dependencies"적절한 버전으로:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

이제거다니를 하세요.node_modules 폴더, 실행을 실행합니다.npm ci(또는)npm install, 을 "" "/" "/npm" "). 그러면 누락된 부품이 추가됩니다."dependencies"부분.


NPM v8.3 기준으로 이 문제를 해결하는 올바른 방법은overrides의 의션 package.jsonjava.

종속성 버전을 알려진 보안 문제로 바꾸거나, 기존 종속성을 포크로 바꾸거나, 모든 위치에서 동일한 버전의 패키지가 사용되는지 확인하는 등 종속성의 종속성을 구체적으로 변경해야 하는 경우 재정의를 추가할 수 있습니다.

재정의를 통해 종속성 트리의 패키지를 다른 버전으로 바꾸거나 다른 패키지 전체로 바꿀 수 있습니다.이러한 변경 사항은 원하는 대로 구체적이거나 모호하게 적용할 수 있습니다.

종속성에 의존하는 버전에 관계없이 패키지 foo가 항상 버전 1.0.0으로 설치되도록 하려면 다음과 같이 하십시오.

{
  "overrides": {
    "foo": "1.0.0"
  }
}

패키지가 특정 패키지 계층의 종속성인 경우에만 패키지를 재정의할 수 있도록 다양한 더 미묘한 구성이 있습니다.자세한 내용은 https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides 를 참조하십시오.

@Rogerio Chaves에서 개발한 npm-force-resolution을 사용하는 것이 유일한 솔루션(노드 12.x, npm 6.x)이었습니다.

먼저 다음 방법으로 설치합니다.

npm install npm-force-resolutions --save-dev

추가할 수 있습니다.--ignore-scripts손상된 전이 종속성 스크립트로 인해 아무것도 설치할 수 없는 경우.

그럼인에서.package.json재정의할 종속성 정의(정확한 버전 번호를 설정해야 함):

"resolutions": {
  "your-dependency-name": "1.23.4"
}

그고리로."scripts"섹션 새 설치 전 항목 추가:

"preinstall": "npm-force-resolutions",

지금이다,npm install변화와 힘을 적용할 것입니다.your-dependency-name버전에 있는1.23.4모든 종속 관계에 대하여.

실을 사용하는 분들을 위한.

저는 npm shrinkwrap.json 파일을 무시하는 yarn cli를 발견할 때까지 npm shrinkwrap을 사용하려고 했습니다.

Yarn은 이것을 위해 https://yarnpkg.com/lang/en/docs/selective-version-resolutions/ 을 가지고 있습니다.근사해.

다음 답변도 확인하십시오. https://stackoverflow.com/a/41082766/3051080

완전히 다른 패키지로 중첩된 대체

여기에 나와 있는 다른 답변에 설명된 대부분의 전략은 패키지의 버전 번호를 재정의하는 데 관심이 있는 경우에는 잘 작동하지만, 우리의 경우에는 중첩된 npm 하위 종속성을 다른 패키지로 재정의하는 방법을 찾아야 했습니다.이 작업을 수행하려는 이유에 대한 자세한 내용은 다음 질문을 참조하십시오.

다른 패키지 버전 번호뿐만 아니라 다른 패키지로 중첩된 npm 하위 종속성을 완전히 재정의하는 방법은 무엇입니까?

tarball을 직접 지정합니다.

에는 패지를 중경대는우체를 합니다.npm-force-resolutions다른 사람들이 언급한 전략은 일반적으로 우선 버전 번호를 지정하는 타르볼에 대한 링크를 제공하기만 하면 됩니다.

를 들어,를 대체하는 에는, 예들어취, 패를교는경우하약지체키를,ansi-html패키지의 인 이소의고정포크로포,▁of▁the로포크▁with,▁package▁fork,ansi-html-community의 의 결심 package.json다음과 같이 표시됩니다.

"resolutions": {
    "ansi-html": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz"
}

tarball에 대한 링크를 찾으려면 다음 명령을 사용하여 필요에 따라 레지스트리를 수정합니다.

npm view ansi-html-community dist.tarball --registry=https://registry.npmjs.org/

또한 다음의 경우에 유의하십시오.npm-force-resolutions달릴 때 일을 합니다npm install당신은 필요할 것입니다.preinstallscripts의부의 한 package.json:

  "scripts": {
    "preinstall": "npx npm-force-resolutions"
  }

나머지 답변을 토대로 동일한 솔루션을 제공하지만 패키지를 표시합니다.json, 오버라이드를 어디에 어떻게 배치할지에 대해 약간 고민했을 때.

{
  "name": "my-app",
  "version": "snapshot",
  "scripts": {
    "ng": "ng",
    "build-dev": "ng build --configuration development",
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~14.2.9",
    "@angular/common": "~14.2.9"
    ...
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^14.2.8",
    ....
  },
  "overrides": {  
    "loader-utils@>2.0.0 <3": "2.0.4",
    "loader-utils@>3.0.0 <4": "3.2.1"
  }
}

2022년 11월 "로더 유틸리티" 보안 취약성에 대해 다음과 같이 요청되었습니다.

  • 버전 2.0.4를 사용합니다(2인 경우).x
  • 버전 3.2.1을 사용합니다(3인 경우).x

그리고 확인하기 위해

  • 패키지를 추가합니다.재지정 태그의 j
  • package-lock.json을 삭제합니다.
  • "npm install" 실행
  • "npm audit" 실행

은 로컬에서 할 때( @user11153이라는 이름의 )node_modules), 다음과 같은 정보를 얻을 수 있습니다.

npm-force-resolutions: command not found

▁the를 업데이트해야 했습니다.preinstall스크립트 대상:

"preinstall": "npm i npm-force-resolutions && npm-force-resolutions"

그것은 확실히.npm-force-resolutions패키지를 실행하기 전에 설치해야 합니다.

그렇긴 하지만, 만약 당신이 실을 대신 사용할 수 있다면, 저는 그렇게 하고 @Gus의 대답을 사용할 것입니다.

중첩된 종속성 중 하나에 npm 감사 취약성이 있는 문제가 있었지만 상위 종속성 버전을 유지하려고 했습니다.npm shrinkwrap 솔루션이 작동하지 않았기 때문에 중첩된 종속성 버전을 재정의하기 위해 수행한 작업

  1. package-lock.json의 '필수' 섹션에서 중첩된 종속성을 제거합니다.
  2. 패키지의 DevDependencies 아래에 업데이트된 종속성을 추가합니다.json. 그래야 모듈이 계속 액세스할 수 있습니다.
  3. npmi

나는 막 내려가려던 참이었습니다.npm-force-resolutions는 길지만 하는 것처럼 .package.json저를 위해 문제를 해결했습니다.

원래 종속성을 사용하면 업데이트하려는 해당 종속성의 패치 버전을 사용할 수 있기 때문에 이 작업이 제 경우에 효과가 있었다고 생각합니다.따라서 새로운 버전을 수동으로 포함함으로써 기존 종속성을 여전히 충족하고 제가 수동으로 추가한 종속성을 사용합니다.

문제

업데이트해야 합니다.plyr 전로으로3.6.93.6.8

내꺼

package.json

{
  "dependencies": {
    "react-plyr": "^3.2.0"
  }
}

리액트 플라이어

package.json

{
  "dependencies": {
    "plyr": "^3.6.8"
  }
}

에 대한 plyr은 그이시작는의존으로 합니다.^이는 사소한 패치도 허용할 수 있음을 의미합니다.자세한 내용은 여기를 참조하십시오.

https://docs.npmjs.com/about-semantic-versioning#using-semantic-versioning-to-specify-update-types-your-package-can-accept

내 항목 업데이트 중

업트합다가 됩니다.plyr나로부터의 의존.package.json.

package.json

{
  "dependencies": {
    "plyr": "^3.6.9",
    "react-plyr": "^3.2.0"
  }
}

먼저 실행

npm i -D @types/eslint@8.4.3

그것은 그 문제를 해결할 것입니다.

언급URL : https://stackoverflow.com/questions/15806152/how-do-i-override-nested-npm-dependency-versions