중첩 된 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.