(本当に簡単な解決策が必要な場合は、最後の段落にジャンプしてください)
アプリの構造を理解するのに苦労しています。私はあなたがやろうとしていることを理解していると思います。https://npmjs.org/doc/folders.htmlから、サブモジュールがいつ、なぜ表示されるか、または表示されないかについて実際に詳しく説明しています。
ローカルにインストールする場合、npm は最初に適切なプレフィックス フォルダーを見つけようとします。これは、たまたま他のフォルダーに CD を移動した場合でも、 npm install foo@1.2.3 がパッケージの適切なルートにインストールされるようにするためです。
$PWD から開始して、npm はフォルダー ツリーをたどり、package.json ファイルまたは node_modules フォルダーのいずれかを含むフォルダーをチェックします。そのようなものが見つかった場合、それはnpm コマンドを実行する目的で有効な「現在のディレクトリ」として扱われます。(この動作は、作業ディレクトリで git コマンドを実行するときにロジックを求める git の .git-folder に触発され、似ています。)
パッケージ ルートが見つからない場合は、現在のフォルダーが使用されます。
npm install foo@1.2.3 を実行すると、パッケージがキャッシュにロードされ、./node_modules/foo に解凍されます。次に、foo の依存関係のいずれかが同様に ./node_modules/foo/node_modules/... に展開されます。
別の見積もりのために我慢してください...
サイクルは、ノードのモジュール システムのプロパティを使用して処理され、ノードは node_modules フォルダーを探してディレクトリを上ります。そのため、すべての段階で、パッケージが祖先の node_modules フォルダーに既にインストールされている場合、そのパッケージは現在の場所にはインストールされません。
上記の場合を考えてみましょうfoo -> bar -> baz
。baz
それに加えて、 に依存している場合を想像しbar
てみてくださいfoo -> bar -> baz -> bar -> baz ...
。ただし、フォルダー構造は foo/node_modules/bar/node_modules/baz である.../baz/node_modules
ため、require("bar") を呼び出すと、 にインストールされているコピーが取得されるため、 bar の別のコピーを に配置する必要はありませんfoo/node_modules/bar
。
このショートカットは、まったく同じバージョンが複数のネストされたnode_modules
フォルダーにインストールされる場合にのみ使用されます。a/node_modules/b/node_modules/a
2 つの「a」パッケージが異なるバージョンである場合でも可能です。ただし、まったく同じパッケージを複数回繰り返さなくても、無限の後退は常に防止されます。
bundledDependencies に関する限り:
パブリッシュすると [これはパッキングにも適用されます]、npm は node_modules フォルダーを調べます。bundledDependencies 配列にない項目がある場合、それらはパッケージ tarball に含まれません。
これは、リストされたモジュールと特定のサブモジュールのみをバンドルすることを意味すると考えています。もちろん、上記のように、ディレクトリツリーを再帰的にたどります...したがって、このディレクトリに別のファイルがある場合、npmはパックに含めるバンドルされたdepsがあるかどうかを確認します。./node_modules/
./package.json
package.json
したがって、現在理解しているように、ベースディレクトリにパッケージがないため、package.json にバンドルされた依存関係は何もしません。実際に bundledDependencies フィールドに項目があると、良いことよりも害が大きくなります。
package.json
修正するには、各レベルでこれらのバンドルを含めるようにファイルを編集する必要があります。
ノードジツで動作するパックされてからアンパックされた流星アプリを取得しようとしたときに、以前にこの問題が発生しました。別の方法で解決しました。アプリのルート フォルダーにすべての最上位ノード モジュールを含め、それらのバージョンを明示的にpackage.json
ファイルに設定しました。
私が理解していることから、あなたのファイル構造は次のようなものです:
アプリ
+-- エンジン
+-- サーバー
| | +-- socket.io
| | | | `-- package.json
| | | | +-- node_modules
` -- readme.md
`-- package.json
その場合は、socket.io のpackage.json
下を編集して、必要なバンドルされた deps を含める必要があります。一般的には、パッケージのメンテナーが有効なバージョンを保持していると信頼できます (しかし、この場合はできませんか?)。
パックされてSocket.io-client
いないのは、socket.io の依存関係の結果です。
これを自分で簡単にする方法を提案する場合は、メインの最上位package.json
ファイルに、アプリに必要な依存関係を必要な特定のバージョンに含めることをお勧めします。何らかの理由でそれらをバンドルする必要がある場合は、作成者が意図したものとは異なるバージョンのサブモジュールが必要な場合は、バンドルされたセクションに追加してください。package
orという名前のフォルダーを作成しvendor
、そこにモジュールを配置することを検討してください。これらのモジュールでは、編集してpackage.json
、その依存関係を心のコンテンツにバンドルできます。ただし、自分の下にあるファイルやフォルダー、またはvendor
ファイルのあるpackages
ディレクトリを無視しないようにしてください。.npmignore
.gitignore
または、これが難しすぎる場合 (すべてのこれらのファイルを編集し、特定のバージョンを指定するのは面倒な場合があります)、ベンダー パッケージをスクリプトでダウンロードできる場所にホストし、このスクリプトをスクリプトのpostinstall
一部で実行することをお勧めします。 package.json ( https://npmjs.org/doc/scripts.htmlを読んでください...「開始」スクリプトがあるのと同じセクションにこれを追加します。
それが物事を明確にすることを願っています。