※本記事は近々修正する予定です。詳細はコメント欄をご覧ください。
前提条件
macOS: Sonoma 14.5 / M2
Ruby: 3.3.1
Ruby on Rails: 7.1.3
Tailwind CSS: 3.4.3
daisyUI: 4.11.1
Heroku: 8.11.5
1. Ruby on Rails に Tailwind CSS / daisyUI を適応
- $ rails new APP_NAME -c tailwind -d postgresql
2. ローカルでは無事CSSが適応されていることを確認
3. Herokuデプロイ時にエラーが起きた
- Precompiling assets failed.
- Error: Cannot find module 'daisyui'
【参考資料】
上記を参考にしながら作業を進め、デプロイ時にエラーが起きた
エラー文
$ git push heroku main
...
...
...
remote: -----> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
remote: Browserslist: caniuse-lite is outdated. Please run:
remote: npx update-browserslist-db@latest
remote: Why you should do it regularly: https://github.com/browserslist/update-db#readme
remote: Rebuilding...
remote: Error: Cannot find module 'daisyui'
remote: Require stack:
remote: - /tmp/build_5b4356e1/config/tailwind.config.js
remote: at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
remote: at Function._resolveFilename (pkg/prelude/bootstrap.js:1955:46)
remote: at Function.resolve (node:internal/modules/cjs/helpers:108:19)
remote: at Function.resolve (/snapshot/tailwindcss/standalone-cli/patch-require.js:34:38)
remote: at _resolve (/snapshot/tailwindcss/node_modules/jiti/dist/jiti.js:1:251148)
remote: at jiti (/snapshot/tailwindcss/node_modules/jiti/dist/jiti.js:1:253746)
remote: at /tmp/build_5b4356e1/config/tailwind.config.js:21:5
remote: at evalModule (/snapshot/tailwindcss/node_modules/jiti/dist/jiti.js:1:256443)
remote: at jiti (/snapshot/tailwindcss/node_modules/jiti/dist/jiti.js:1:254371)
remote: at /snapshot/tailwindcss/lib/lib/load-config.js:52:30 {
remote: code: 'MODULE_NOT_FOUND',
remote: requireStack: [ '/tmp/build_5b4356e1/config/tailwind.config.js' ]
remote: }
remote: rake aborted!
remote: Command failed with exit 1: /tmp/build_5b4356e1/vendor/bundle/ruby/3.3.0/gems/tailwindcss-rails-2.6.0-x86_64-linux/exe/x86_64-linux/tailwindcss
remote: /tmp/build_5b4356e1/vendor/bundle/ruby/3.3.0/gems/tailwindcss-rails-2.6.0-x86_64-linux/lib/tasks/build.rake:7:in `system'
remote: /tmp/build_5b4356e1/vendor/bundle/ruby/3.3.0/gems/tailwindcss-rails-2.6.0-x86_64-linux/lib/tasks/build.rake:7:in `block (2 levels) in <main>'
remote: Tasks: TOP => assets:precompile => tailwindcss:build
remote: (See full trace by running task with --trace)
remote:
remote: !
remote: ! Precompiling assets failed.
remote: !
remote: ! Push rejected, failed to compile Ruby app.
remote:
remote: ! Push failed
remote: Verifying deploy...
remote:
remote: ! Push rejected to app-name.
remote:
To https://git.heroku.com/app-name.git
! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/app-name.git'
着目したエラー文
Preparing app for Rails asset pipeline
Running: rake assets:precompile
Browserslist: caniuse-lite is outdated. Please run:
npx update-browserslist-db@latesta
Why you should do it regularly: https://github.com/browserslist/update-db#readme
Railsアセットパイプライン用のアプリを準備しているよ!
rake assets:precompileを実行中だよ!
ブラウザーリスト: caniuse-liteが古くなってるよ! このコマンドを実行してね!
定期的にやる理由はreadmeを見てね
----------
Rebuilding...
Error: Cannot find module 'daisyui'
rake aborted!
Precompiling assets failed.
Push rejected, failed to compile Ruby app.
ビルドしなおしているよ...
エラー: 'daisyui'モジュールが見つからない
rakeが中断されたよ!
アセットのプリコンパイルに失敗した
Pushが拒否され、Rubyアプリのコンパイルに失敗した
作業内容 1
- Browserslist: caniuse-lite is outdated. Please run: ~
- $ npx update-browserslist-db@latest してアップデートするも解決しない
-
Heroku ビルドログ を見てみる
- Heroku側で詳しいエラーのログが出ている可能性があります
- (しかし、今回はローカルと同じ内容でした)
→解決に至らず。
作業内容 2
ローカルで rake assets:precompile してみる
$ rake assets:precompile
...
Rebuilding...
🌼 daisyUI 4.11.1
├─ ✔︎ 2 themes added https://daisyui.com/docs/themes
╰─ ★ Star daisyUI on GitHub https://github.com/saadeghi/daisyui
Done in 347ms.
rake aborted!
Sprockets::DoubleLinkError: Multiple files with the same output path cannot be linked ("application.css") (Sprockets::DoubleLinkError)
In "/Users/user_name/APP_NAME/app/assets/config/manifest.js" these files were linked:
- /Users/user_name/APP_NAME/app/assets/stylesheets/application.css
- /Users/user_name/APP_NAME/app/assets/builds/application.css
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)
着目したエラー文
rake aborted!
Sprockets::DoubleLinkError: Multiple files with the same output path cannot be linked ("application.css") (Sprockets::DoubleLinkError)
rakeが中断されたよ!
リンクが重複しているエラー: 同じ出力パスを持つ複数のファイルは、リンクできないよ!
In "/Users/user_name/APP_NAME/app/assets/config/manifest.js" these files were linked:
- /Users/user_name/APP_NAME/app/assets/stylesheets/application.css
- /Users/user_name/APP_NAME/app/assets/builds/application.css
"app/assets/config/manifest.js"の中で、これらのファイルがリンクされているよ!
- app/assets/stylesheets/application.css
- app/assets/builds/application.css
ということで、下記を確認。
//= link_tree ../images
//= link_directory ../stylesheets .css
//= link_tree ../../javascript .js
//= link_tree ../../../vendor/javascript .js
- //= link_tree ../builds # この行が app/assets/builds/application.css を含むので削除
上記だけでは解決せず、scriptを追加
application.tailwind.cssファイルを基にapplication.cssファイルを生成
{
+ "scripts": {
+ "build:css": "tailwindcss build ./app/assets/stylesheets/application.tailwind.css -o app/assets/stylesheets/application.css",
+ "postinstall": "npm run build:css"
+ },
"dependencies": {
"tailwindcss": "^3.0.0",
"daisyui": "^4.11.1"
}
}
$ rm -rf node_modules package-lock.json # 依存関係整理するため削除
$ npm install # 再インストール
$ RAILS_ENV=production rails assets:precompile
(GitHubにpushした後に)
$ git push heroku main
作業内容 3
ご親切に @jnchito さんが、tailwindcss-railsのREADMEに解決策が載っているよ!と教えてくださいました。どうもありがとうございます🙇♂️
せっかくなので、再チャレンジしてみました。
To fix the warning, you can either remove the application.css, if you don't plan to use the asset pipeline for stylesheets, and instead rely on TailwindCSS completely for styles. This is what this installer assumes.
Or, if you do want to keep using the asset pipeline in parallel, make sure to remove the require_tree . line from the application.css.警告を修正するには、スタイルシートにアセットパイプラインを使用しないのであれば、application.cssを削除し、代わりにスタイルを完全にTailwindCSSに依存するようにします。これは、このインストーラが想定していることです。
あるいは、アセットパイプラインを並行して使い続けたい場合、 require_tree . の行を削除してください。
上記に基づいて、
- application.css require_tree . を削除
- application.css 自体を削除
2パターンとも試したのですが、まだエラーは変わりません。
$ rm -rf node_modules
$ npm init -y
$ npm install
$ heroku buildpacks:add --index 1 heroku/nodejs
$ heroku buildpacks:add --index 2 heroku/ruby
$ RAILS_ENV=production rails assets:precompile
(GitHubにPushした後に)
$ git push heroku main
【参考資料】
上記の作業も併せると、Herokuにデプロイ自体は成功しました!
しかし、Failed to load resource: the server responded with a status of 500 (Internal Server Error)
となってしまったので
$ heroku logs --tail
ActionView::Template::Error (The asset "application.css" is not present in the asset pipeline.
<%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %>
- <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
(無事500エラー解消!)
無事にデプロイが成功しました!
ひさしぶりにrails newをしたのですが、CSS・アセットパイプライン周りは難しいですね。
初学者がポートフォリオ制作でひっかかるのでは?と思いまとめてみたのですが、もし不備や間違いなどございましたらご指摘いただけると幸いです。
【追記】
伊藤淳一さんのご助言の基、もう一度思考を巡らせましたがこれがベストプラクティスなのかは定かではありません。。
一参考例にしていただけたら幸いです!もし不備などございましたらコメントいただけたら幸いです🙇♂️