複数のプロジェクトでnode_modulesディレクトリを共有するにはどうすればよいですか?


95

プロジェクトを作成するときはいつでも、ノードモジュールのすべての依存関係をダウンロードする必要があります。node_modulesをコピーせずに、複数のプロジェクトで中央のnode_modulesを共有する方法はありますか?

次のように、私は毎回多くのコマンドを実行する必要があります。

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
共通の親ディレクトリがある場合は、それらをインストールできます。ノードは、dモジュールを検索するディレクトリrequireたどります。それ以外の場合は、いいえ、node_modulesで使用するための公式の「中央」フォルダはありませんrequire()
Jonathan Lonowski 2015

グローバルフラグを使用して、これらのパッケージをグローバルにインストールできます。したがって、毎回インストールコマンドを実行する必要はありません。npm install <npm_package_name> -g
サバハッサン2015

回答:


90

プロジェクト間でnode_modulesディレクトリを絶対に共有できます。

ノードのドキュメントから:

require()に渡されるモジュール識別子がネイティブモジュールではなく、「/」、「../」、または「./」で始まらない場合、ノードは現在のモジュールの親ディレクトリから始まり、 / node_modulesであり、その場所からモジュールをロードしようとします。

そこに見つからない場合は、ファイルシステムのルートに到達するまで、親ディレクトリに移動します。

たとえば、 '/ home / ry / projects / foo.js'にあるファイルrequire( 'bar.js')が呼び出された場合、ノードは次の場所をこの順序で検索します。

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

したがって、node_modulesフォルダーをプロジェクトディレクトリ内に配置し、必要なモジュールを配置するだけです。通常のようにそれらを要求するだけです。ノードがプロジェクトフォルダでnode_modulesディレクトリを見つけられない場合、ノードは親フォルダを自動的にチェックします。したがって、ディレクトリ構造を次のようにします。

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

したがって、このように、サブプロジェクトの依存関係でさえ、メインのnode_modulesリポジトリを利用できます。

この方法の欠点の1つは、package.jsonファイルを手動で作成する必要があることです(誰かがうなり声などでこれを自動化する方法を知らない限り)。パッケージをインストールしてnpm installコマンドに--saveargを追加すると、依存関係セクションまたはpackage.jsonに自動的に追加されます。これは便利です。


3
なぜこれが回答操作として受け入れられないのですか?@tpieへのさらなる質問ですが、あなたが提案したようなプロジェクトを構築する場合、親モジュールリポジトリからインストールするpackage.jsonをどのようにビルドしますか。
diehell 2016年

@diehellつまり、「オールオアナッシング」のようです。すべてまたは依存関係が親ディレクトリに存在し、CWDにnode_modulesディレクトリがない場合、npmは親をチェックし、見つかった場合はそこにインストールします。node_modulesフォルダーをディレクトリに置くと、そこにインストールされます。
tpie 2016

4
共有node_modulesが異なるパッケージバージョンを処理する方法がわかりません。c:\ users(Windows)のnpm-cacheとは異なり、node_modulesのパッケージはバージョン管理されていません。誰かがそれに遭遇しましたか?
サイバーゲスト2018年

npmスクリプトとpackage.jsonファイルを作成するときに、パラダイムをどのように変更しますか?
マドック

18

私はトリックを見つけました。WindowsまたはLinuxシンボリックリンク(シンボリックリンク)を見てください。ショートカットと同じように機能しますが、より強力です。

単にあなたが望むどこにでもJunctionあなたのnode_modulesフォルダのためにを作る必要があります。ジャンクションは、元のnode_modulesフォルダーへのショートカットに他なりません。使用した場合に実際のnode_modulesが作成されたプロジェクトフォルダー内に作成しますnpm installた。

これを実現するには、少なくとも1つのnode_modules実フォルダーが必要であり、他のプロジェクトでそのフォルダーにジャンクションを作成します。

Windowsでは、コマンドプロンプトを使用するか、アプリケーションを使用できます。プロンプトコマンドを使用すると、アプリケーションを使用して、私が提案する簡単です、あなたにもう少しコントロールを与えるリンクシェル拡張を


1
ターゲットディレクトリにCDを挿入し、次のコマンドを実行しますmklink /d node_modules (source dir)\node_modules
ChrisTorng 2017

1
私のチームはしばらくの間この方法を使用しています。私node_modulesはプロジェクトフォルダ自体にないことを本当に軽蔑していますが、これは機能します。node_modules新しいものをインストールする前に、実際のフォルダを参照することを忘れないでください:P
AndrewCraswell18年

この方法は私にはうまくいかないようです。シンボリックまたはジャンクションのいずれかを使用すると、node-sassで次のエラーが発生します:モジュールのビルドに失敗しました:「エラー:モジュールは自己登録しませんでした」エラーには、「共有」node_modulesディレクトリが存在するディレクトリを指定する詳細が含まれています。何か案は?
フリップコード2018

1
npm install「接続された」アプリのいずれかで実行しているときに依存関係のプルーニングを回避するにはどうすればよいですか?
QWERTY配列の

1
しかしnpm install <new-package>、現在のプロジェクトのpackage.jsonにないすべてのパッケージを実行すると、削除されます。
Rohit Kaushal

17

npmの代わりにpnpmを試してください。

pnpmは、ハードリンクとシンボリックリンクを使用して、モジュールの1つのバージョンをディスクに1回だけ保存します。

一緒にインストール:

npm install -g pnpm

既存のインストール(およびサブディレクトリ)を更新するには、次を使用します。

pnpm recursive install

8

メインディレクトリは次のようになります

node_modules
Project 1
Project 2
Project 3
Project 4

ファイルを開くだけです Project 1/.angular-cli.json

スキーマを変更する

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

node_modulesプロジェクトディレクトリ内に空のフォルダを作成することを忘れないでください


あなたは私のヒーローです。私はこれに一週間を費やしました。どうもありがとうございます!!
エリエゼルベルリン

5

いくつかの記事を見ると、Lerna は単一のディレクトリ内の複数のプロジェクトを管理するための優れたツールであるように思われます(monorepo)。すべてのフォルダー内のパッケージ全体を複製せずにモジュールを共有し、それらを複数のプロジェクトにインストールするコマンドをサポートします。

pnpmはシンプルで効率的なツールでもあり、他のプロジェクト用にすでにインストールされているモジュールを複製しません。


0

node_modulesが1つあると、すべてのアプリケーションのすべてのパッケージが含まれている必要があると仮定します。したがって、アプリは一意のpackage.jsonエントリのほとんども共有します(名前だけを変更する必要があります)

私の考えは、以下のように単一のルートと複数のsrcレベルを持つことです

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

直面する可能性のある唯一の問題は、任意のアプリのjson(またはtsconfig)のバックアップを作成し、それに取り組んだり、任意のアプリを提供するようにスタートアップスクリプトを設定したりするときにそれらを復元することです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.