1

NPMパック、ひいてはnodejitsuは、私のnode_modulesフォルダーが気に入らないようです。:*(

私は現在、Webアプリを構築しています。

私のWebアプリのプロジェクトフォルダー構造は次のとおりです。

Engine(folder)                      Server(folder)    readme.md     package.json

(複数のフォルダー)(フォルダー)(フォルダー)node_modules(フォルダー)

                   easyimage,mongodb,mysql(folders)       socket.io (folder)

       node_modules(folder, NPM Pack ignores this)           node_modules(folder, NPM Pack ignores this)

                                                       Socket.io-client (folder, NPM Pack ignores this)

みんながこの構造を大丈夫に見ることができることを願っています!

私が抱えている問題は、ルートディレクトリでNPM Packを実行すると、最初のnode_modulesフォルダーの下にあるすべてのnode_modulesフォルダーを除いて、ディレクトリ構造全体が正しくパックされることです。

これは、NPMパックがこれらのnode_modulesフォルダーを完全に無視するかのようです。(たとえば、socket.ioの下にあるもの)。

NPMパックがこれらのnpmフォルダーを無視するという事実のために、jitsuもそれらを無視しており、Webアプリを起動できません。

NPM pack / nodejitsuにすべてのnode_modulesフォルダーを正しくパッケージ化するにはどうすればよいですか?

ルートディレクトリにある現在のpackage.jsonファイルは次のようになります:http: //pastebin.com/SAU6rwb5

ご覧のとおり、bundleDependenciesを使用してNPM Packにいくつかのnode_modulesフォルダー(モジュール?)を含めようとしていることを伝えようとしましたが、packはそれらすべてを無視します...また、「依存関係」の下に何かを含めると、 NPM startは、ルートディレクトリに新しい(??)node_modulesフォルダーを作成します...しかし、ルートディレクトリにはnode_modulesは必要ありません...サーバーフォルダー内でnode_modulesが使用されていることがわかります。

NPM Packですべてのnode_modulesフォルダー内のファイルとフォルダーを認識し、正しくパックするにはどうすればよいですか?

4

1 に答える 1

5

(本当に簡単な解決策が必要な場合は、最後の段落にジャンプしてください)

アプリの構造を理解するのに苦労しています。私はあなたがやろうとしていることを理解していると思います。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 -> bazbazそれに加えて、 に依存している場合を想像し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/a2 つの「a」パッケージが異なるバージョンである場合でも可能です。ただし、まったく同じパッケージを複数回繰り返さなくても、無限の後退は常に防止されます。

bundledDependencies に関する限り:

パブリッシュすると [これはパッキングにも適用されます]、npm は node_modules フォルダーを調べます。bundledDependencies 配列にない項目がある場合、それらはパッケージ tarball に含まれません。

これは、リストされたモジュールと特定のサブモジュールのみをバンドルすることを意味すると考えています。もちろん、上記のように、ディレクトリツリーを再帰的にたどります...したがって、このディレクトリに別のファイルがある場合、npmはパックに含めるバンドルされたdepsがあるかどうかを確認します。./node_modules/./package.jsonpackage.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ファイルに、アプリに必要な依存関係を必要な特定のバージョンに含めることをお勧めします。何らかの理由でそれらをバンドルする必要がある場合は、作成者が意図したものとは異なるバージョンのサブモジュールが必要な場合は、バンドルされたセクションに追加してください。packageorという名前のフォルダーを作成しvendor、そこにモジュールを配置することを検討してください。これらのモジュールでは、編集してpackage.json、その依存関係を心のコンテンツにバンドルできます。ただし、自分の下にあるファイルやフォルダー、またはvendorファイルのあるpackagesディレクトリを無視しないようにしてください。.npmignore.gitignore

または、これが難しすぎる場合 (すべてのこれらのファイルを編集し、特定のバージョンを指定するのは面倒な場合があります)、ベンダー パッケージをスクリプトでダウンロードできる場所にホストし、このスクリプトをスクリプトのpostinstall一部で実行することをお勧めします。 package.json ( https://npmjs.org/doc/scripts.htmlを読んでください...「開始」スクリプトがあるのと同じセクションにこれを追加します。

それが物事を明確にすることを願っています。

于 2012-08-10T20:15:49.893 に答える