ネストされた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 2013

3
grunt-contrib-jasmineは0.5.1にありgrunt-lib-phantomjs@0.3.1、これはを使用し、phantomjs@1.9.1-0:) を使用します
gustavohenke 2013

回答:


238

npmシュリンクラップを使用できます依存関係またはサブ依存関係を上書きするために、機能。

私はこれを私たちのうらやましいプロジェクトでやったところです。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 2015

5
@iDVBと同じ問題が発生しました。node_modules最終的にディレクトリを編集して、完全なシュリンクラップ依存関係ダンプが、単にオーバーライドするだけでなく、まさに望んだとおりになるようにしました。しかし、それでも一種の痛みを伴う解決策です。
Kobold

2
@Domiこのファイルはnpmシュリンクラップを実行することによって作成され、エントリは手動で追加されません
glasspill

13
残念ながら、そのバグで言及されているように、npm4では、最小限のアプローチは機能しなくなります。(を削除する場合node_modules、最小のシュリンクラップでインストールを実行すると、をdevDependencies無視してもそのまま残るように見えますdependenciesが、別のインストールを実行すると非明示的なアイテムが削除されるため、今のところ、実行npm shrinkwrapしてファイル全体を取得し、問題の部分を変更することが重要です。その後、npm install再度実行します)
Brett Zamir 2017

6
npm 6.4はシュリンクラップファイルを上書きし、古い依存関係を使用します
ShadSterling

83

2018年以降のバージョンの場合、npmバージョン5以降を使用:編集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 installすると、欠落しているパーツが"dependencies"セクションに追加されます。


4
npm install1回実行する限り、これは良いことです。私の場合、ネストされたdepが失敗の原因となっているため、編集が必要です。
ppasler 2018年

59
これは、実行削除いつになるnpm iあなたのpackage.json「依存関係」セクションに子の依存関係を追加し、代わりにあなたのパッケージ-lock.jsonを編集し、そこに「依存関係」に子の依存関係を追加する
trickpatty

6
私はあなたのために正確にそれを自動的に行うライブラリを作成しました:github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves

14
それは機能しますが、npm installもう一度実行すると、すべての変更package-lock.jsonが元に戻り、depの不良バージョンが返されます。
2rs2ts 2018

14
私は走っていますがnpm ci、これには触れませんpackage-lock.json
sschoof


0

ネストされた依存関係の1つにnpm監査の脆弱性があるという問題がありましたが、それでも親の依存関係のバージョンを維持したいと思っていました。npmシュリンクラップソリューションは私にとっては機能しなかったので、ネストされた依存関係バージョンをオーバーライドするために何をしたか:

  1. package-lock.jsonの「requires」セクションでネストされた依存関係を削除します
  2. package.jsonのDevDependenciesの下に更新された依存関係を追加して、それを必要とするモジュールが引き続きアクセスできるようにします。
  3. npm i

-1

NPMシュリンクラップは、この問題に対する優れたソリューションを提供します。特定のサブモジュールの特定の依存関係のバージョンを上書きすることができます。

基本的に、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
これは現在受け入れられている回答とは異なりますか?その回答には2つの賛成意見があり、新しいバージョンのnpmは追加の手動手順が必要か、このソリューションで望ましくないことを行うことを示唆しています。そうではありませんか?
Fabio Beltramini、

-1

私に役立つ解決策を見つけました。

そう。最初にnpm-shrinkwrap.jsonファイルを編集して、他のすべてのソリューションを推奨します。

次に、(Windowsの場合):

  • 「npm-shrinkwrap.json」ファイルを右クリックします
  • プロパティ
  • [属性]で[読み取り専用]を選択します。 これにより、npmがmpn-shrinkwrap.jsonファイルを変更できなくなります。

「npm install」操作を1回だけ行う場合は、他の提案されたソリューションで十分です。ただし、最初の「npmインストール」の後、ファイル「npm-shrinkwrap.json」は、変更前と同様に再度変更されます。


-1:変更を加えるたびにファイルのロックを解除する必要があります。そのような場合は、とにかく手動での編集をシュリンクラップファイルに適用できなくなります。さらに、コードで共同作業をしている人は誰でもこのハックを有効にする必要があります。
thomaux
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.