Node.jsで未使用のパッケージをアンインストールまたはプルーニングするnpmコマンド


414

未使用の(宣言されていない)すべての依存関係をNode.jsプロジェクト(私ので定義されていないもの)から単にアンインストールする方法はありpackage.jsonますか。


1
何が未使用?node_modulesそれぞれから削除されたときにフォルダーを削除するつもりpackage.jsonですか?
SLaks 2014年

1
正確には、mhm npm llは候補である良いヒントをすでに提供しています。
Tarion 2014年

回答:


670

:最近のnpmバージョンでは、パッケージロックが有効になっているときにこれが自動的に行われるため、--productionフラグを使用して開発パッケージを削除する場合を除いて、これは必要ありません。


npm pruneリストされていないモジュールを削除するために実行しますpackage.json

からnpm help prune

このコマンドは、「余分な」パッケージを削除します。パッケージ名を指定すると、指定した名前のいずれかに一致するパッケージのみが削除されます。

無関係なパッケージとは、親パッケージの依存関係リストにリストされていないパッケージです。

--productionフラグが指定されている場合、このコマンドはdevDependenciesで指定されているパッケージを削除します。


3
私がそれを正しく読んだ場合、それらはにリストされていないため、すべてのサブ依存関係が削除されpackage.jsonます。そうですか?したがって、次の更新またはインストールでは、それらを再インストールする必要があります。
nshew 2014

1
はい、それはサブ依存関係を削除します。サブ依存関係は、実際にはモジュール自体のnode_modulesディレクトリ内に格納されているため、モジュールとともに削除されます。
Darkhogg 2014

2
例を挙げましょう。私はからカルマを取り除きますが、お辞儀はしてpackage.jsonおきます。を実行するとnpm prunenode_modules依存関係を含む独自のフォルダーを含むすべてのカルマが削除されることを期待しています。bowerの依存関係(bower-json、bower-logger、chmodr、fstream、globなど)はどうですか?技術的には、それらは私のプロジェクトのにリストされていませんpackage.json。それらは削除されていますか?
nshew 2014

3
いいえそうではありません。彼らがしていることに注意してくださいではない自分自身でnode_modulesはなく、内部 node_modules/bower/node_modulesで「保護」node_modules/bower/package.json。パッケージの依存関係とパッケージの依存関係は混在していません
Darkhogg

2
npmをインストールする前にシュリンクラップ削除してください。
アンディレイ

306

あなたがこれを行うには数分時間を心配していない場合は、解決策は、になりますrm -rf node_modulesし、npm installローカルモジュールを再構築するために、再び。


93
人々がコメントなしでこれへの反対投票をやめればいいのですが。承認された回答の代わりとしてノードプロジェクトの依存関係をリセットすることは有効な戦略です。node_modulesサブディレクトリの内容を損傷した場合(symリンクされた依存関係で簡単に実行できます)、またはnodeまたはnpm versionのような追加の変更を行った場合、burns pruneはnode_modulesフォルダーを適切にクリーンアップしませんが、この回答はクリーンアップします。
Pyrce 2016年

41
再構築node_modulesでは、package.jsonファイルが再現可能な依存関係グラフを記述していることも確認します。の削除と再インストールnode_modulesは、基本的に展開テストです。
joemaller

2
@joemaller必ずしもそうではありませんが、ほとんどのデプロイメントワークフローには、暗黙的または明示的に何らかのキャッシュがあります。パッケージがすでにインストールされており、仕様に適合している場合は、そのまま保持されます。削除してから再インストールすると、そのパッケージが一致する最新バージョンにバンプされます。
Darkhogg 2016年

7
npm prune1つのイオタを助けなかったが、これは助けた。私の問題は壊れたシンボリックリンクでした。
Eirik Birkeland

8
現在npmでは実行できない多くの非理想的な状況下。また、質問では、繰り返しの作業や追加のフェッチにいくつかの制約を明確に指定しておらず、最終目標を達成する方法だけを指定していました。他の人がその目標を超えて何を望んでいるかにかかわらず、この回答は前述の質問を満たします。
2016年

10

npm-pruneを使用して、無関係なパッケージを削除できます。

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

このコマンドは、「余分な」パッケージを削除します。パッケージ名を指定すると、指定した名前のいずれかに一致するパッケージのみが削除されます。

無関係なパッケージとは、親パッケージの依存関係リストにリストされていないパッケージです。

場合--productionのフラグが指定されているかNODE_ENVの環境変数がに設定されている生産は、このコマンドは、あなたに指定されたパッケージが削除されますdevDependenciesを。設定--no-生産することは否定されますNODE_ENVがに設定されている生産

--dry-runフラグが使用されている場合、実際には変更は行われません。

場合--jsonフラグが使用される変更NPMプルーン製の(またはで作られたであろう--dryラン)JSONオブジェクトとして印刷されます。

パッケージロックが有効になっている通常の操作では、モジュールがインストールされると無関係なモジュールが自動的にプルーニングされ、このコマンドに必要なのは--productionフラグを指定した場合のみです。

パッケージロックを無効にした場合、無関係なモジュールは削除されず、npm pruneを時々実行してそれらを削除するのはあなた次第です。

npm-dedupeを使用して重複を減らす

npm dedupe
npm ddp

ローカルパッケージツリーを検索し、依存関係をツリーの上位に移動することで全体的な構造を簡略化しようとします。依存関係を複数の依存パッケージでより効果的に共有できます。

たとえば、次の依存関係グラフを考えてみます。

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

この場合、npm-dedupeはツリーを次のように変換します。

 a
 +-- b
 +-- d
 `-- c@1.0.10

ノードのモジュールルックアップの階層的な性質により、bとdはどちらも、ツリーのルートレベルで単一のcパッケージによって依存関係が満たされます。

重複排除アルゴリズムはツリーをウォークし、重複が見つからない場合でも、各依存関係をツリー内で可能な限り上に移動します。これにより、フラットなツリーと重複排除されたツリーの両方が生成されます。


npm重複排除を実行した、node_modulesフォルダーさらに項目があります。はぁ!
ネビル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.