Alpine Linux で Rails 6 で rails-erd を使おうとするとつらい
概要
rails向けのER図出力ツールとしてメジャーな rails-erdを Alpineベースの Docker で使おうとしたら結構面倒だったのでその備忘録。
すでに1年以上メンテされておらず、Rails 6 がサポートされる気配もないのであくまで暫定的なワークアラウンドという方向で。
Gemfile
group :development do gem 'rails-erd' end
Dockerfile
グラフを描画するためのパッケージ graphbiz が必要となるのでインストールする。
また、alpineの場合対応するフォントを入れてやらないと出力されたグラフの文字部分が豆腐になるので色々入れる。
RUN apk add --update --no-cache \ graphviz \ msttcorefonts-installer \ fontconfig \ font-bitstream-type1 \ ghostscript-fonts \ ttf-freefont RUN update-ms-fonts \ && fc-cache -f \ && rm -rf /var/cache/*
フォントは darwin 以外では Arial が使われるようになっているので、msttcorefonts-installer
でインストールする。
また、これだけだと NOT NULL を表す *
(U+2217) が正しく表示されなかったりするので他にもいくつか入れている。
実行
bundle exec erd
以下のWarningが出る。
Rails 6 未サポートだからか。
Warning: Ignoring invalid model ActionText::RichText (table action_text_rich_texts does not exist)
Warning: Ignoring invalid model ActionMailbox::InboundEmail (table action_mailbox_inbound_emails does not exist)
Warning: Ignoring invalid model ActiveStorage::Blob (table active_storage_blobs does not exist)
Warning: Ignoring invalid model ActiveStorage::Attachment (table active_storage_attachments does not exist)
通常のユーザーが作ったモデルであれば、--exclude
オプションをつけることで出力しないようにすることができるが、これらは色々試しても除外できなかった。
--exclude="ActionText::RichText"
--exclude="RichText"
--exclude="action_text_rich_texts
全部効かない。
特に影響ない Warning なので無視するしかない。
ちなみに --warn
オプションつければ出力を制御できる。
eager_load
こんなエラーが出ることもある。
Failed: RuntimeError: No entities found; create your models first!
モデルクラスが認識されていないため。
これに関するワークアラウンドはいくつかある。
1. v6.0.3 以上にする
内部的にはRails.application.eager_load!
で読み込んでいるのだが、ZeitwerkではZeitwerk::Loader.eager_load_all
をする必要がある。
だがこのあたりの変更は結構活発に進んでいるようで、6.0.3からRails.application.eager_load!
が後方互換性のために復活した。
なのでバージョンアップすれば問題なく動く。
2. config.eager_load = true
以下バージョンアップできない環境向け。
eager_loadの設定を変更すれば動く。
3. eager_load!
のオーバーライド
結構香ばしいですね。
module Rails class Application def eager_load! Zeitwerk::Loader.eager_load_all end end end
4. タスクのオーバーライド
3を局所的に解決する例
FP_Reservation/auto_generate_diagram.rake at master · MurakiSari/FP_Reservation · GitHub