Herokuでnode.jsアプリを作成するときに、node_modulesをgitにチェックインする必要がありますか?


368

ここでHerokuのnode.jsの基本的な開始手順に従いました:

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

これらの指示では、.gitignore node_modulesを作成するように指示されていないため、node_modulesをgitにチェックインする必要があります。gitにnode_modulesを含めると、開始アプリケーションが正しく実行されました。

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

https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio https://github.com/mongolab/tractorpush-server (ソース)

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」を実行すると、クラッシュが確認されます。問題ありません。変更をロールバックし、node_moduleをgitリポジトリに追加して、.gitignoreから削除しました。ただし、元に戻した後でも、デプロイ時に同じエラーメッセージが表示されますが、アプリケーションは再び正しく実行されています。「heroku ps」を実行すると、アプリケーションが実行されていることがわかります。

だから私の質問はこれを行う正しい方法は何ですか?node_modulesを含めるかどうか また、ロールバックしてもエラーメッセージが表示されるのはなぜですか?私の推測では、GitリポジトリはHeroku側で悪い状態にあるのでしょうか?


10
私はHerokuのNode言語の所有者であり、答えは簡単です。いいえnode_modules。Herokuアプリにチェックインしないでください。
hunterloftis 2016

@hunterloftis「node_modules チェックインしない」または「node_modules チェックインしない」明確にするために、Herokuのノード言語の所有者として、git pushを介してnode_modules全体をアップロードするかどうかを決めますか?帯域幅の浪費とHerokuがそれらを私のgit pushのバックエンドで取得するという事実のため、私は好みません。ただし、Herokuにアプリをロードさせるには、node_modulesのファイルを手動で編集する必要がありました。したがって、私はnode_modulesを無視して、編集したファイルを含むモジュール全体を除いて、それを機能させる必要がありました。
ZStoneDPM

回答:


400

2回目の更新

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

のドキュメントからshrinkwrap

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

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


更新

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

通常はありません。npmがパッケージの依存関係を解決できるようにします。

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

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


元の投稿

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

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

そして、これのいくつかの良い根拠については、これに関するMikeal Rogersの投稿を読んでください


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


13
これは正しくありません-実際には非常に悪い考えです。Windowsで開発してからLinuxで展開する場合は、展開時にnode_modulesを再構築する必要があります。つまり、カオス。変更されたファイルがたくさんあり、何をすべきかわからない。
user3690202 14年

8
それは不可能です-私たちの開発者の一部はターゲットウィンドウを開発し、他の開発者はLinuxをターゲットにしますが、同じコードベースです。最善のアプローチは、ノードモジュールをコミットしないことです-おっと。
user3690202 '20 / 06/20

7
@ user3690202あなたは標準ではなく、非常に型破りなケースを持っているように聞こえるので、「これは正しくない」と言うのはおそらく過大な表現です。そうは言っても、正確なユースケースが何かはわかりませんが、開発にWindowsとLinuxの両方を使用する理由は考えられません。1つに固執し、サポートするすべてのプラットフォームでテストまたはQAを実行します。
Kostia 2014年

16
@Kostia私たちのユースケースはかなり一般的なものです。私たちはボランティアであり、会社のマシンではなく、自分のマシンを使用しています。オープンソースのかなり一般的な状況のようです。
2014

4
@Adam接線的に、コンパイルされるファイルを追加できます.gitignoreか?こうすることで、ソースはgitのであり、そして任意のコンパイル済みのコンポーネントは、同様にどのように、ではないdistか、outputうなり声と一口プロジェクトにgitignoredされているフォルダ。
Kostia 14

160

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

これは、Mavenのようなリポジトリマネージャーで軽減できます。これは、ローカルのNexusまたはArtifactoryを常に使用して、使用するパッケージでミラーを維持できるためです。私の知る限り、そのようなシステムはnpmには存在しません。BowerやJamjsなどのクライアント側ライブラリマネージャーについても同様です。

自分のgitリポジトリにファイルをコミットした場合は、好きなときにファイルを更新できます。また、繰り返し可能なビルドの快適さと、サードパーティのアクションのためにアプリが壊れないという知識があります。


10
今日の多くのオプション:Nexus(issues.sonatype.org/browse/NEXUS-5852)、Artifactory(jfrog.com/jira/browse/RTFACT-5143)、npm_lazy(github.com/mixu/npm_lazy)、npm-lazy-ミラー(npmjs.org/package/npm-lazy-mirror)など
Johann

4
npmjs FAQからの引用:「npmエコシステムに依存することに偏執的である場合は、プライベートnpmミラーまたはプライベートキャッシュを実行する必要があります。」これはあなたが言及している問題を指していると思いますよね?
タイラン


2
Npmは一晩で消えるわけではないので、この利点は実際にはコミット履歴と巨大なバンドルサイズの明快さの喪失とうまく対になりません。だれかが10年後もまだアクティブであると考えるアプリケーションを構築している場合、その過程で多くのメンテナンスを受けることを期待するのは妥当です。NPMの停止に関する要点ははるかに優れた議論ですが、ソースにコミットするよりもそのリスクを軽減するためのより良い方法がおそらくあります。
Sam P

3
依存関係をコミットしないと(できれば別のリポジトリで)、1か月先でも危険です。ある朝、自分のプロジェクトの1つを複製したときに、パッケージバージョンがnpmから削除されていることがわかりました。私は、カスケード依存関係のすべてのバージョンを変更するために半日かけてnpm更新を機能させ、再度ビルドしました。
リチャード

67

あなたは必要があります含まれていない node_modulesあなたに.gitignore(というか、あなたが含まれている必要があり node_modules、あなたの元に Herokuのに展開します)。

の場合node_modules

  • 存在する場合npm installは、これらのベンダーライブラリを使用し、バイナリ依存関係をで再構築しnpm rebuildます。
  • 存在しない場合はnpm installすべての依存関係自体をフェッチする必要があるため、スラッグのコンパイル手順に時間がかかります。

これらの正確な手順については、Node.jsビルドパックのソースを参照してください

ただし、元のエラーは、バージョン間の互換性になりそうだnpmnode。これらのタイプの状況を回避するために、このガイドに従って常にのenginesセクションを明示的に設定することをお勧めします。packages.json

{
  "name": "myapp",
  "version": "0.0.1",
  "engines": {
    "node": "0.8.x",
    "npm":  "1.1.x"
  }
}

これにより、開発/製品のパリティが保証され、将来このような状況が発生する可能性が低くなります。


ライアンを助けてくれてありがとう。これでnpmバージョンのエラーは解消されましたが、redisパッケージをコンパイルすると失敗します。エラーメッセージは「OSError:[Errno 2] No such file or directory: '/ Users / Jason / tastemade / tastebase / node_modules / redis-url / node_modules / redis / node_modules / hiredis / build'」です。Herokuサーバー上のローカルボックスからのパスを使用しているようです。.gitignoreに追加する必要があるnode_modulesに特定のファイルがありますか?
ジェイソングリフィン

特定のライブラリで何が起こっているのかはわかりませんが、この場合はgitからnode_modulesを除外して、それが役立つかどうかを確認します(npmにすべてをフェッチさせ、新しいビルド環境を確保します)。
ライアンデイグル

@RyanDaigle npm(npmjs.org/doc/…)とheroku(devcenter.heroku.com/articles/…)の両方が推奨するベストプラクティス(2013年11月)は、node_modulesをgitにチェックインすることです。回答を更新しますか(課金が高いため)?
Tim Diggins 2013年

herokuにプッシュすると、出力 "-----> Caching node_modules directory for future builds"が表示されます。これは、将来のスラグのコンパイルを短縮するためです。
ph3nx 2014年

node_modulesファイルパスが長すぎてコミットできないという問題があります。Gitはファイルを見つけられません。
コードファラオ

22

私はこのコメントの後にこれを残していました:Herokuでnode.jsアプリを作成するときに、node_modulesをgitにチェックインする必要がありますか?

しかし、stackoverflowは奇妙なフォーマットでした。同一のマシンがなく、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

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


これを追加しました。私の問題を解決しました。Windows githubが7000以上のnode_moduleファイルを移動しようとしてクラッシュし続けました:/
Batman

10

npm install実稼働環境では実行しないでください。問題が発生する可能性のあるいくつかの問題があります。npmの停止、新しい依存関係のダウンロード(シュリンクラップで解決されたようです)の2つです。

一方、node_modulesgitではコミットしないでください。それらの大きなサイズとは別に、それらを含むコミットは混乱を招く可能性があります。

最良のソリューションはこれnpm installです。本番環境と同様のCI環境で実行する必要があります。すべてのテストが実行され、すべての依存関係を含む圧縮リリースファイルが作成されます。


デプロイメントの一部として実行されないステップがCIで実行されるのはなぜですか?これは、2つのシステム間に同等性がないことを意味します。上記の答えが言うように-フォルダーをコミットすると、ネイティブ拡張を無視するだけで、npmの停止などの問題に対応できます
Voycey

1
ご意見ありがとうございます。本番サーバーで実行されるnode_modulesは、開発者がコミットしたものからではなく、npmインストールから生成する必要があると思います。開発者のnode_modulesフォルダーは、package.jsonの内容と必ずしも一致しません。
user2468170

8

私はcommit_node_modulesフォルダーとシュリンクラップの両方を使用しています。どちらの解決策も私を幸せにしませんでした。

つまり、コミットされたnode_modulesは、リポジトリに過度のノイズを加えます。
また、shrinkwrap.jsonは管理が容易ではなく、一部のシュリンクラップされたプロジェクトが数年でビルドされる保証はありません。

Mozillaがプロジェクトの1つに別のリポジトリを使用していることがわかりましたhttps://github.com/mozilla-b2g/gaia-node-modules

したがって、このアイデアをノードのCLIツールに実装するのに時間がかかりませんでしたhttps://github.com/bestander/npm-git-lock

すべてのビルド追加の直前
npm-git-lock --repo [git@bitbucket.org:your / dedicated / node_modules / git / repository.git]を追加します

これは、package.jsonのハッシュを計算し、リモートリポジトリからnode_modulesのコンテンツをチェックアウトするか、このpackage.jsonの最初のビルドの場合は、クリーンnpm installで結果をリモートリポジトリにプッシュします。


5

私にとってうまくいったのは、npmバージョンをpackage.json( "npm": "1.1.x")に明示的に追加し、gitにnode_modulesをチェックインしないことでした。(毎回パッケージをダウンロードするため)展開に時間がかかる可能性がありますが、チェックイン時にパッケージをコンパイルできませんでした。Herokuは、ローカルボックスにのみ存在するファイルを探していました。


私の答えが正しいと感じた場合は、それを受け入れてください。ありがとうございました!
ライアンデイグル2012

場合には、これは最高の議論のためにまだ、私は上記のほとんどあなたの質問の重複しているこのstackoverflowの記事を見てみます: stackoverflow.com/questions/11459733/... 基本的には、大会がnode_modulesにチェックすることですようで、これらのモジュールのバージョンをローカルで管理します。これはかなり合理的であり、おそらく最も簡潔な説明はこれです: mikealrogers.com/posts/nodemodules-in-git.html 頑張ってください!
warriorpostman

3

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

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


私はpackage.jsonを持っています。次のものがあります:{"name": "node-example"、 "version": "0.0.1"、 "dependencies":{"express": "2.5.x"、 "redis-url": "0.1。 0 "、" mongodb ":"> = 0.9.9 "}、" engines ":{" node ":" 0.8.x "}}
Jason Griffin

ローカルボックスでnode_modulesディレクトリを作成しました。それが私がチェックインし、削除してから追加し直したものです。
ジェイソングリフィン

チュートリアルをさらに見ると、node_modulesをコミットしているようです。その場合、node_modulesをコミットしない方法があるかどうかわかりません。申し訳ありません
matzahboy

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

  1. プラットフォーム固有のリンクを作成node_modulesするnode_modulesディレクトリと追加node_modules.gitignoreます。
  2. を実行しますnpm install
  3. サブモジュールリポジトリの変更をコミットします。
  4. プロジェクトリポジトリの変更をコミットします。

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


3

https://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.htmlから:

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

要点をまとめると。

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

私が大好きな部分:

node_modulesをgitignoreに追加したすべての人は、そのたわごとを削除します。今日、それは、私たちが残しておいてあまりに幸せな時代の成果物です。グローバルモジュールの時代は終わりました。


リンクしたサイトは期限切れになり、現在は詐欺的な広告でいっぱいになっているようです。私はそれらの広告が「私たち全員が残しておくにはあまりにも幸せだと思う時代の遺物」であるといいのですが。
Flavio Copes

1
@FlavioCopes Wayback Machineからのリンクで私の回答を更新しました。
Benjamin Crouzier

2

http://nodejs.org/api/modules.html

[...]ノードは現在のモジュールの親ディレクトリから始まり、を追加し/node_modules、その場所からモジュールをロードしようとします。

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

アプリに固有の独自のモジュールをローリングしている場合は、それらの(およびそれらのみ)をアプリの/node_modules。他のすべての依存関係を親ディレクトリに移動します。

この使用例は非常に素晴らしいもので、アプリ用に特別に作成したモジュールをアプリで適切に保持でき、後でインストールできる依存関係でアプリが乱雑になることはありません。


1

シナリオ1:

1つのシナリオ:npmから削除されるパッケージを使用します。node_modulesフォルダーにすべてのモジュールがある場合、問題はありません。package.jsonにパッケージ名しかない場合、それを取得することはできません。パッケージが24時間以内の場合は、npmから簡単に削除できます。24時間以上経過している場合は、連絡する必要があります。だが:

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

続きを読む

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


シナリオ2:

これが当てはまる別のシナリオ:ソフトウェアのエンタープライズバージョンまたは非常に重要なソフトウェアを開発し、package.jsonに書き込みます。

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

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

studpid-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を超える)をリポジトリにプッシュすると、メモリ容量が消費されます。数百キロバイト(package.jsonのみ)と比較すると、数百メガバイト(package.json&node_modules)と比較して...考えてみてください。

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

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

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

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

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

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

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


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

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