394

ここでは、Heroku で Node.js を使用するための基本的な開始手順に従いました。

https://devcenter.heroku.com/categories/nodejs

これらの手順では、.gitignore node_modules を作成するように指示されていないため、フォルダーnode_modulesを Git にチェックインする必要があることを意味します。node_modulesを Git リポジトリに含めたところ、開始アプリケーションが正しく実行されました。

私がより高度な例に従ったとき:

フォルダーnode_modulesをファイル.gitignoreに追加するように指示されました。そこで、Git からフォルダーnode_modulesを削除し、それをファイル.gitignoreに追加してから、再デプロイしました。今回は、デプロイが次のように失敗しました。

-----> Heroku receiving push
-----> Node.js app detected
-----> Resolving engine versions
       Using Node.js version: 0.8.2
       Using npm version: 1.0.106
-----> Fetching Node.js binaries
-----> Vendoring node into slug
-----> Installing dependencies with npm
       Error: npm doesn't work with node v0.8.2
       Required: node@0.4 || 0.5 || 0.6
           at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
           at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
           at Module._compile (module.js:449:26)
           at Object.Module._extensions..js (module.js:467:10)
           at Module.load (module.js:356:32)
           at Function.Module._load (module.js:312:12)
           at Module.require (module.js:362:17)
           at require (module.js:378:17)
           at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
           at Module._compile (module.js:449:26)
       Error: npm doesn't work with node v0.8.2
       Required: node@0.4 || 0.5 || 0.6
           at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
           at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
           at Module._compile (module.js:449:26)
           at Object.Module._extensions..js (module.js:467:10)
           at Module.load (module.js:356:32)
           at Function.Module._load (module.js:312:12)
           at Module.require (module.js:362:17)
           at require (module.js:378:17)
           at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
           at Module._compile (module.js:449:26)
       Dependencies installed
-----> Discovering process types
       Procfile declares types -> mongod, redis, web
-----> Compiled slug size is 5.0MB
-----> Launching... done, v9

「heroku ps」を実行すると、クラッシュが確認されます。OK、問題ありません。変更をロールバックし、フォルダーnode_moduleを Git リポジトリに追加し、ファイル.gitignoreから削除しました。ただし、元に戻した後でも、デプロイ時に同じエラー メッセージが表示されますが、アプリケーションは再び正しく実行されるようになりました。「heroku ps」を実行すると、アプリケーションが実行中であることがわかります。

これを行う正しい方法は何ですか?フォルダーnode_modulesを含めるかどうか また、ロールバックしてもエラー メッセージが引き続き表示されるのはなぜですか? 私の推測では、Git リポジトリは Heroku 側で悪い状態になっていると思います。

4

12 に答える 12

404

2 回目の更新

FAQ はもう利用できません。

のドキュメントからshrinkwrap:

パッケージに含まれる特定のバイトをロックダウンする場合 (たとえば、展開またはビルドを再現できることを 100% 信頼できるようにする場合)、依存関係をソース管理にチェックインするか、検証できる他のメカニズムを追求する必要があります。バージョンではなく内容。

シャノンとスティーブンはこれについて前に言及しましたが、それは受け入れられた答えの一部であるべきだと思います.


アップデート

以下の推奨事項に記載されているソースが更新されました。彼らは、node_modulesフォルダーをコミットすることを推奨していません。

通常、いいえ。npm がパッケージの依存関係を解決できるようにします。

Web サイトやアプリなど、デプロイするパッケージの場合、npm Shrinkwrap を使用して完全な依存関係ツリーをロックダウンする必要があります。

https://docs.npmjs.com/cli/shrinkwrap


元の投稿

参考までに、npm FAQ はあなたの質問に明確に答えています。

Web サイトやアプリなど、デプロイするものについては、node_modules を git にチェックインします。再利用を目的としたライブラリとモジュールの node_modules を git にチェックインしないでください。npm を使用して、開発環境で依存関係を管理しますが、デプロイ スクリプトでは管理しません。

この理由については、 Mikeal Rogers の投稿をお読みください。


ソース: https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git

于 2013-10-17T00:46:38.657 に答える
169

フォルダーnode_modulesを Git にチェックインしないことに対する私の最大の懸念は、本番アプリケーションがまだ使用されている 10 年後、npm が存在しない可能性があることです。または、npm が破損する可能性があります。または、メンテナーが、依存しているライブラリをリポジトリから削除することを決定する場合があります。または、使用しているバージョンが削除されている可能性があります。

これはMavenのようなリポジトリ マネージャーで軽減できます。これは、独自のローカルNexus (Sonatype) またはArtifactoryを使用して、使用するパッケージのミラーを常に維持できるためです。私の知る限り、npm にはそのようなシステムは存在しません。同じことが、BowerJam.jsなどのクライアント側のライブラリ マネージャーにも当てはまります。

ファイルを独自の Git リポジトリにコミットしている場合は、必要に応じてそれらを更新できます。繰り返し可能なビルドの快適さと、サードパーティのアクションによってアプリケーションが壊れないという知識があります。

于 2013-02-13T11:50:36.277 に答える
25

このコメントの後にこれを残すつもりでした: Heroku で Node.js アプリを作成するときに、フォルダ "node_modules" を Git にチェックインする必要がありますか?

しかし、スタックオーバーフローはそれを奇妙にフォーマットしていました。

同一のマシンがなく、node_modules をチェックインしている場合は、ネイティブ拡張で .gitignore を実行します。.gitignore は次のようになります。

# Ignore native extensions in the node_modules folder (things changed by npm rebuild)
node_modules/**/*.node
node_modules/**/*.o
node_modules/**/*.a
node_modules/**/*.mk
node_modules/**/*.gypi
node_modules/**/*.target
node_modules/**/.deps/
node_modules/**/build/Makefile
node_modules/**/**/build/Makefile

最初にすべてをチェックインしてこれをテストし、次に別の開発者に次の作業を依頼します。

rm -rf node_modules
git checkout -- node_modules
npm rebuild
git status

ファイルが変更されていないことを確認します。

于 2014-09-05T22:03:32.187 に答える
11

npm install本番環境で実行するべきではないと思います。うまくいかないことがいくつかあります - npm の停止、新しい依存関係のダウンロード ( shrinkwrapがこれを解決したようです) はそのうちの 2 つです。

一方、フォルダーnode_modulesは Git にコミットしないでください。それらの大きなサイズは別として、それらを含むコミットは気を散らす可能性があります。

最善の解決策は次のとおりです。運用環境に似たCInpm install環境で実行する必要があります。すべてのテストが実行され、すべての依存関係を含む圧縮されたリリース ファイルが作成されます。

于 2015-04-29T09:47:22.650 に答える
6

npm バージョンをファイルpackage.json ("npm": "1.1.x") に明示的に追加し、フォルダーnode_modulesを Git にチェックインしないことは、私にとってはうまくいきました。

(毎回パッケージをダウンロードするため) デプロイに時間がかかる可能性がありますが、チェックイン時にパッケージをコンパイルできませんでした。Heroku はローカル ボックスにのみ存在するファイルを探していました。

于 2012-07-13T14:12:13.410 に答える
4

Git の「node_modules」から:

要点をまとめると。

  • 維持する再利用可能なパッケージではなく、展開するアプリケーションの node_modules のみをチェックインします。
  • コンパイルされた依存関係は、コンパイル ターゲットではなく、ソースをチェックインする必要があり、デプロイ時に $ npm を再構築する必要があります。

私の好きなところ:

gitignore に node_modules を追加したすべての人は、そのたわごとを削除してください。グローバルモジュールの時代は終わりました。

(元のリンクはこれでしたが、現在は無効になっています。指摘してくれた @Flavio に感謝します。)*

于 2014-02-10T09:15:23.407 に答える
4

フォルダーnode_modulesをチェックインする代わりに、アプリケーションのpackage.jsonファイルを作成します。

package.json ファイルは、アプリケーションの依存関係を指定します。その後、Heroku は npm にこれらの依存関係をすべてインストールするように指示できます。リンク先のチュートリアルには、package.jsonファイルに関するセクションが含まれています。

于 2012-07-12T19:56:12.993 に答える
3

私はこのソリューションを使用しています:

  1. フォルダーnode_modulesを保持する別のリポジトリを作成します。特定のプラットフォーム用にビルドする必要があるネイティブ モジュールがある場合は、プラットフォームごとに個別のリポジトリを作成します。

  2. 以下を使用して、これらのリポジトリをプロジェクト リポジトリにアタッチしますgit submodule

    git submodule add .../your_project_node_modules_windows.git node_modules_windows

    git submodule add .../your_project_node_modules_linux_x86_64 node_modules_linux_x86_64

  3. node_modulesプラットフォーム固有からnode_modulesディレクトリへのリンクを作成し、に追加node_modules.gitignoreます。

  4. 実行しますnpm install

  5. サブモジュール リポジトリの変更をコミットします。

  6. プロジェクト リポジトリの変更をコミットします。

そのため、異なるプラットフォーム間で簡単に切り替えることができnode_modulesます (たとえば、OS X で開発し、Linux にデプロイする場合)。

于 2015-08-27T21:24:24.903 に答える
3

シナリオ 1:

1 つのシナリオ:

npm から削除されるパッケージを使用します。フォルダー node_modules にすべてのモジュールがある場合、問題はありません。package.json にパッケージ名しかない場合は、もう取得できません。

パッケージが 24 時間以内であれば、npm から簡単に削除できます。24 時間以上経過している場合は、連絡する必要があります。

しかし:

サポートに連絡すると、そのバージョンのパッケージを削除すると他のインストールが中断されるかどうかを確認します。その場合、削除しません。

続きを読む

したがって、これの可能性は低いですが、シナリオ 2 があります...


シナリオ 2:

これが当てはまる別のシナリオ:

ソフトウェアのエンタープライズ バージョンまたは非常に重要なソフトウェアを開発し、package.json に次のように記述します。

"dependencies": {
    "studpid-package": "~1.0.1"
}

function1(x)そのパッケージのメソッドを使用します。

ここで、sdpid-package の開発者はメソッドの名前function1(x)をに変更し、失敗を犯しましfunction2(x)た... 彼らはパッケージのバージョンを から1.0.1に変更しました1.1.0。チルダ ( ) を使用したため、次に呼び出すときにnpm installバージョンを受け入れるため、これは問題です。1.1.0"studpid-package": "~1.0.1"

呼び出すfunction1(x)と、エラーや問題が発生する可能性があります。


node_modules フォルダー全体 (多くの場合 100 MB 以上) をリポジトリにプッシュすると、メモリ容量が消費されます。数百 MB (package.json & node_modules) と比較して、数 kb (package.json のみ)...考えてみてください。

あなたはそれを行うことができます/それについて考える必要があります:

  • ソフトウェアは非常に重要です。

  • 何かが失敗するとお金がかかります。

  • npm レジストリを信頼していません。npm は一元化されており、理論的にはシャットダウンできます。

次の場合、99.9% のケースで node_modules フォルダーを公開する必要はありません

  • あなたは自分のためだけにソフトウェアを開発します。

  • 何かをプログラムして、その結果を GitHub に公開したいだけです。他の誰かが興味を持っている可能性があるからです。


node_modules をリポジトリに入れたくない場合は、.gitignoreファイルを作成して行を追加するだけnode_modulesです。

于 2019-01-01T14:23:25.943 に答える
2

アプリケーションに固有の独自のモジュールを展開する場合は、次のいずれかを実行できます。

  • それら (およびそれらのみ) をアプリケーションの/node_modulesフォルダーに保持し、他のすべての依存関係を親../node_modulesフォルダーに移動します。これは、ツリーのルートに到達するまで、NodeJS CommonJS モジュール システムが親ディレクトリに移動するなどして動作するため、機能します。参照: https://nodejs.org/api/modules.html

  • /node_modules/* または、あなた以外のすべてをgitignoreします/node_modules/your-modules。参照: .gitignore でいくつかのファイルを除くすべてを無視する

このユースケースはかなり素晴らしいです。アプリケーション用に特別に作成したモジュールを適切に保持でき、後でインストールできる依存関係で混乱することはありません。

于 2014-07-02T20:13:08.177 に答える