Ruby と Rails のアップデート後に Heroku のスラッグ サイズ制限に遭遇する
概要
Ruby と Rails を次のマイナー リリース (Ruby と Rails それぞれ 3.2.2 から 3.3.0、7.0.8 から 7.1.2) に更新する作業を行っていますが、Heroics のスラッグ サイズ制限に遭遇しています。圧縮後の 520MB は明らかに制限を超えています。
私のアプリは Google Text to Speech gem を利用していますが、これは明らかに grpc gem に依存しており、多くのスペースを占有しているようです。
それ以外の場合、他に問題の原因がわかりません。 Ruby 3.3.0 にアップデートする前は、スラッグ警告は発生しませんでした。とりあえずRuby 3.2.2にダウングレードしたほうがいいでしょうか?
解決策
Ruby 3.2.2 と Ruby 3.3.0 の比較はできませんが、それを聞くのは憂慮すべきことです (そして、アップグレードを延期する理由になる可能性もあります)。
今後この質問を見つける人のために、私は積極的な .slugignore ファイルと [Heraku Post-Build Clean Buildpack|https://elements.heroku.com/buildpacks] を使用して Heroku のスラッグ サイズを減らすことに多くの成功を収めてきました。 /lostmyname/heroku-buildpack-post-build-clean]
heroku buildpacks:add --index integer_index_based_on_how_many_buildpacks_you_have https://github.com/Lostmyname/heroku-buildpack-post-build-clean.git
次の .slug-post-clean ファイルを使用
node_modules
tmp/cache
tmp/cache/webpacker
そしてこのような .slugignore ファイル
*.psd
*.pdf
/test
/spec
問題に応じて、他にも役立つコマンドがいくつかあります。
heroku config:set BUNDLE_WITHOUT=“開発:docker:test”
heroku ビルド:キャッシュ:パージ
[Thoughtbot|https://thoughtbot.com/blog/how-to-reduce-a-large-heroku-compiled-slug-size] に従って、追加のマイルを獲得できる可能性がある Heroku リポジトリ プラグインをインストールすることもできます。
heroku plugins:install heroku-repo
次に、次を実行します。
heroku repo:gc --app your-app-name
heroku repo:purge_cache --app your-app-name
Heroku では、大きな PDF、PSD、または画像ファイルもプロジェクトから削除することをお勧めします (大きな画像は間違いなくスラッグ サイズを増大させる可能性があります)。
また、この [ブログポスト|https://blog.saeloun.com/2020/05/04/how-to-reduce-heroku-slug-size] で概説されているアプローチが、次のようなカスタム アセット クリーン タスクを追加するのに役立つこともわかりました。以下の例では、コンパイル後、スラッグが生成される直前に、node_modules フォルダーを削除します。
# cat lib/tasks/assets.rake
# Adapted from https://github.com/heroku/heroku-buildpack-ruby/issues/792
namespace :assets do
desc "Remove 'node_modules' folder"
task rm_node_modules: :environment do
Rails.logger.info "Removing node_modules folder"
FileUtils.remove_dir("node_modules", true)
end
end
skip_clean = %w(no false n f).include?(ENV["WEBPACKER_PRECOMPILE"])
unless skip_clean
if Rake::Task.task_defined?("assets:clean")
Rake::Task["assets:clean"].enhance do
Rake::Task["assets:rm_node_modules"].invoke
end
else
Rake::Task.define_task("assets:clean" => "assets:rm_node_modules")
end
end
頑張ってナメクジを潰してください (また、Patrick のように最近 Ruby 3.2.2 から Ruby 3.3.0 にアップグレードした場合は、ダウングレードして問題が解決するかどうかを確認するだけでも価値があるようです)。
ナメクジに塩をかけてください!