less is more

心のフルスタックエンジニア👨‍💻バイブスでコードを書いています🤘

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