web-dev-qa-db-ja.com

npm installの仕組み

Node.jsを( browserify を使用して)各Webアプリに使用します。これらのアプリにはすべて共通の依存関係と、固有の依存関係があります。これらのアプリにはそれぞれ、必要なモジュールのバージョンを指定する_package.json_ファイルがあります。

現在、すべてのモジュールが参照する必要のあるモジュールのアプリの親フォルダーに_/node_modules_ディレクトリがあり、アプリ固有のモジュールをそのアプリのディレクトリの_node_modules_フォルダーに配置しています。私のrequire()ステートメントは、正しいアプリが含まれる_node_modules_ディレクトリを見つけるまでファイル構造を上方向に見続けることができるため、これは短期的には正常に機能します。

これが難しいのは、古いプロジェクトに戻って_npm install_を実行して、必要な依存関係をすべて見つけられるようにする場合です。 (その後、親ディレクトリレベルでおかしなビジネスが発生したことを知っている人。)_npm install_がこれを行ったという印象を受けました。

  • _package.json_にリストされている各モジュールについて、最初にそれが存在するかどうかを確認し、requireが同じようにディレクトリを上に移動します。そうでない場合は、ローカルの_node_modules_ディレクトリにインストールします(必要に応じてそのディレクトリを作成します)。

ただし、アプリフォルダー内で_npm install_を実行すると、他にアップストリームが存在する場所に関係なく、すべてをローカルにインストールするように見えます。それは正しい動作ですか? (_package.json_のバージョン言語が悪いなど、別の理由がある可能性があります)。これがIS正しい動作である場合、_npm install_を上記のように動作させる方法はありますか?

すべてのアプリ内でモジュールを広く複製することは大したことではありませんが、面倒な感じがあり、一般的なモジュールを少し改善し、古い_package.json_ファイルをすべて更新する必要はありません。もちろん、これは良いことかもしれません...

28
Chris Wilson

ただし、アプリフォルダー内でnpm installを実行すると、アップストリームにどこにあるかに関係なく、すべてをローカルにインストールするように見えます。それは正しい動作ですか? (私のpackage.jsonに不適切なバージョンの言語があるなど、別の理由がある可能性があります)。これがIS正しい動作である場合、npmインストールを上記のように動作させる方法はありますか?

はい、それがnpm installの機能です。 node.jsコードでは、requireアルゴリズムには、ファイルシステムの探索など、特定の一連の場所があります。しかしながら、 npm installはそれをしません。所定の場所にインストールするだけです。使用するアルゴリズムはすべて、単一のnode_modulesディレクトリは現在のディレクトリの下にあり、その上には何も触れません(-g)。

すべてのアプリ内でモジュールを広く複製することは大したことではありませんが、面倒であり、一般的なモジュールを少し改善したり、古いpackage.jsonファイルをすべて更新したりする必要がありません。もちろん、これは良いことかもしれません...

ええ、基本的にあなたは間違っています。通常のワークフローは、インターネットに適しています。ユースケースでは、余分な面倒な作業が発生しますが、セマンティックバージョニングを意図したとおりに使用し、"mylib": "^1.0.0"アプリのpackage.jsonで、次回に自動的に新しいバージョンを取得しても問題ありませんnpm install

22
Peter Lyons