こんにちはエンジニア薬剤師の和(かず)です。
最近、Rails プロジェクトに Electron や Next.js を統合してモノレポ運用を始めたところ、思わぬ落とし穴にハマりました。
駆け出しすぎるミスに自身で驚愕しました。
経緯とハマりポイント
Electron / Next.js のようなフロントエンド中心のフレームワークと Rails を monorepo 構成で統合する際、node_modules/ の扱いに注意が必要です。
筆者は GitHub の 1ファイル100MB制限 を知らず、Electron の node_modules/ をまるごと commit & push してしまい、push エラーに…。
remote: error: File node_modules/xxxxx is 161.15 MB; this exceeds GitHub's file size limit of 100.00 MB
最終的には git filter-repo を使って履歴から除去したり、git cloneして新たにディレクトリ作成したりと、なんとか復旧しました。
Railsで node_modules/ が .gitignore に無い理由は?
Next.js などでは初期状態で .gitignore に node_modules/ が含まれていますが、Rails ではそうではありません。
ここで疑問がわきました。
「最近は Rails でも Stimulus や Turbo を使って JS も書くのに、なんで標準で gitignore に設定されてないの?」
調べてみたところ、Rails側の思想が見えてきました。
RailsのJS管理戦略は複数存在する
Railsではプロジェクトによって JS をどう扱うかが異なります。
| ライブラリ | 概要 |
node_modules/ 必要か |
|---|---|---|
importmap-rails |
CDNやローカルからESMで読み込み | ❌ 不要 |
jsbundling-rails (esbuild/webpack等) |
npm経由でJS管理・ビルド | ✅ 必要 |
Propshaft |
静的アセット配信 | ⚠️ 使い方次第 |
hotwired/stimulus, turbo-rails
|
Importmap or npm経由で導入可能 | 構成依存 |
※ 上記はGPTにまとめてもらいました。こういうまとめ資料作りにの時ほんと助かる...
つまり、「JSをどう扱うかはプロジェクト次第」 という思想が前提にあり、Rails本体は.gitignoreにnode_modules/ を強制していない、というのが理由のようです。
まぁよく考えたらそうなのですが..
それでも .gitignore に含めた方がいい理由
とはいえ、以下の理由から 最初から
.gitignore に /node_modules を含めておくのが安全 です:
- 後から esbuild や webpack へ移行する可能性がある
- node_modules/ は非常に重く、誤って push すると復旧が面倒
- Electron や Next.js を統合する際には必須で .gitignore 対象
- GitHub は 1ファイルあたり 100MB 上限。CI/CD にも影響
結論と運用上のベストプラクティス
個人的見解はこんな感じです。
| パターン |
.gitignore に /node_modules を追加すべき? |
|---|---|
| Rails 単体で importmap を使うだけ | ❌ 必須ではないが、追加しても問題なし |
今後 esbuild などを使うかも |
✅ 最初から含めておくと安全 |
| モノレポ構成(Electron / Next.js 同梱) | ✅ 必須。全体の .gitignore に記載を推奨 |
最後に: GitHubの制限と git filter-repo の活用
今回の経験を通じて、以下の2点も強く意識するようになりました。
- GitHubのファイル上限:1ファイル 100MBまで
- git filter-repo は履歴から安全にファイルを除去できる強力なツール
https://github.com/newren/git-filter-repo
node_moduleをgit管理しない理由
もっというと、yarn.lock とかでバージョンをきちんと管理して、そのバージョンを yarnpkg.com 等で管理してくれているので git のような VCS でさらに管理する必要が無いからというのが根本としてありそうですね。
まとめ
モノレポ構成で Rails とフロントエンドを組み合わせる際は .gitignore の設定を慎重に行うことが重要です。
特に node_modules/ の扱いは、小さな見落としが後々のトラブルにつながるため、チームでルールを定めて運用するのが良さそうですね。
また、個人開発なのでいろんな方のご意見いただきたいなと思いました。