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


290

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해야합니까?

몇 가지 추가 컨텍스트 :


그냥 git clone또는 포크 필요한 모듈. 중첩을 phantomjs수동으로 제거 할 수도 있습니다.
— Aleksei Zabrodskii

3
grunt-contrib-jasmine용도 0.5.1,에 grunt-lib-phantomjs@0.3.1사용 phantomjs@1.9.1-0:
— gustavohenke

답변:


238

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

방금 우리 프로젝트에서이 작업을 수행했습니다. 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/ 참조 )


7
이 작업을 수행하면 grunt-contrib-connect종속성 및 해당 하위 만 설치됩니다. package.json의 다른 모든 종속성이 설치되지 않았습니다.
— iDVB

5
@iDVB와 같은 문제가있었습니다. node_modules전체 수축 랩 종속성 덤프가 단순히 오버라이드가 아니라 원하는 것이되도록 디렉토리 를 편집했습니다 . 그러나 여전히 고통스러운 해결책입니다.
— Kobold

2
@Domi이 파일은 npm shrinkwrap을 실행하여 생성되며, 항목은 직접 추가되지 않습니다
— glasspill

13
불행히도, npm4에서 해당 버그에서 언급했듯이 최소한의 접근 방식은 더 이상 작동하지 않습니다. (삭제할 때 node_modules최소 축소 랩으로 설치를 실행하면 devDependencies무시해도 그대로 유지되지만 dependencies다른 설치를 실행하면 명시 적이 지 않은 항목이 제거되므로 npm shrinkwrap전체 파일을 가져 와서 해당 부분을 수정하고 실행하는 것이 중요합니다.npm install
— Brett Zamir 3:21의

6
npm 6.4는 shrinkwrap 파일을 덮어 쓰고 오래된 종속성을 사용합니다
— ShadSterling

85

2018 이상 버전의 경우 npm 버전 5 이상을 사용하십시오 package-lock.json. 편집 : "requires"섹션 에서 라이브러리를 제거하고 "종속성"아래에 추가하십시오.

예를 들어 deglobpackage에서 현재 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 install하면 누락 된 부분이 "dependencies"섹션에 추가됩니다 .


4
이것은만큼, 좋은 npm install실행 한 시간입니다. 내 경우에는 중첩 된 dep이 실패하기 때문에 편집이 필요합니다.
— ppasler

60
이것은 npm ipackage-lock.json을 편집하고 거기에 "종속성"에 하위 종속성을 추가하는 대신 실행할 때마다 제거됩니다. package.json "종속성"섹션에 하위 종속성을 추가하십시오
— trickpatty

6
나는 자동으로 당신을 위해 정확하게 수행하는 라이브러리를 만들었습니다 github.com/rogeriochaves/npm-force-resolutions을
— 로게 리오 차베스

14
그것은 작동하지만 npm install다시 실행 하면 모든 변경 사항 package-lock.json이 되돌려지고 잘못된 버전의 dep이 다시 나타납니다.
— 2rs2ts

14
나는 달리고 npm ci이것은 package-lock.json
— sschoof


0

중첩 된 종속성 중 하나에 npm 감사 취약성이있는 문제가 있었지만 여전히 부모 종속성 버전을 유지하려고했습니다. npm shrinkwrap 솔루션이 작동하지 않았으므로 중첩 된 종속성 버전을 무시하기 위해 수행 한 작업은 다음과 같습니다.

  1. package-lock.json의 'requires'섹션에서 중첩 된 종속성을 제거하십시오.
  2. package.json의 DevDependencies 아래에 업데이트 된 종속성을 추가하여 필요한 모듈이 계속 액세스 할 수 있도록하십시오.
  3. npm 전

-1

NPM shrinkwrap 은이 문제에 대한 훌륭한 솔루션을 제공합니다. 특정 하위 모듈의 특정 종속성 버전을 재정의 할 수 있습니다.

기본적으로 npm install을 실행하면 npm은 먼저 루트 디렉토리에서 npm-shrinkwrap.json 파일이 있는지 확인합니다. 만약 그렇다면, 우선 이것을 사용하여 패키지 의존성을 결정한 다음 package.json 파일을 통한 정상적인 작업 프로세스로 넘어갑니다.

npm-shrinkwrap.json을 만들려면

 npm shrinkwrap --dev

암호:

{
  "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"
        }
      }
    }
  }
}

3
이것이 현재 허용되는 답변과 다른가요? 이 답변에는 새로운 npm 버전이 추가 수동 단계가 필요 하거나이 솔루션으로 바람직하지 않은 작업을 수행한다고 제안하는 두 가지 의견이 있습니다. 그렇지 않습니까?
— Fabio Beltramini 1

-1

나는 나를 위해 일한 해결책을 찾았다.

그래서. 먼저 다른 모든 솔루션을 권장하는대로 npm-shrinkwrap.json 파일을 편집하십시오.

그런 다음 (Windows) :

  • 'npm-shrinkwrap.json'파일을 마우스 오른쪽 버튼으로 클릭하십시오.
  • 속성
  • 속성에서 '읽기 전용'을 선택하십시오. 이것은 npm이 mpn-shrinkwrap.json 파일을 수정하지 못하게합니다.

'npm install'작업을 한 번만 수행하면 제안 된 다른 솔루션으로는 충분합니다. 그러나 첫 번째 'npm install'후에는 수정 전과 같이 'npm-shrinkwrap.json'파일이 다시 수정됩니다.


-1 : 변경을 원할 때마다 파일을 다시 잠금 해제해야합니다. 이 경우 어쨌든 수동 편집을 shrinkwrap 파일에 잃게됩니다. 또한 코드를 공동 작업하는 사람이라면 누구나이 핵을 활성화해야합니다.
— thomaux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.