ViewComponent 4.10.0 リリース:`eager_load` 環境での定数未初期化エラーを修正
ViewComponent 4.10.0 がリリースされました。eager_load = true の環境でテスト起動時に発生していた NameError を修正した版です。
背景
テスト環境で eager_load = true を設定している場合、アプリケーション起動時に NameError: uninitialized constant ViewComponent::SystemTestControllerNefariousPathError が発生する問題がありました。この問題は、システムテストに関連する ViewComponent::SystemTestControllerNefariousPathError という定数が、eager load の走査順によっては未定義の状態で参照されてしまうことで発生していました。
この修正が本リリースの唯一の変更内容であり、CHANGELOG.md でも単一の変更として記録されています。修正者は Joel Hawksley です。
技術的な変更
バージョン番号の更新は lib/view_component/version.rb の MINOR 定数を 9 から 10 へ変更することで行われ、各 gemfile.lock にも伝播しています。
module ViewComponent
module VERSION
MAJOR = 4
- MINOR = 9
+ MINOR = 10
PATCH = 0
PRE = nil
リリース作業としては Gemfile.lock、gemfiles/ 配下の全 gemfile.lock、docs/_data/library.yml のバージョン文字列が一括更新されています。また、Gemfile.lock からはソースビルド向けの nokogiri (1.19.3) と mini_portile2 (2.8.9) のエントリが削除されています。プラットフォームネイティブの gem(aarch64-linux-gnu など)のみが実際に使用されており、ソースビルド版が不要になったことを反映したロックファイルの整理です。
設計判断
リリーススクリプト script/release の update_gemfiles 関数が改善されました。従来は appraisal-run コマンドと個別の BUNDLE_GEMFILE 指定を組み合わせた複雑な処理でしたが、for ループで gemfiles/*.gemfile を一括処理する形に統一されています。
変更前:
# NOTE: appraisal-run doesn't support ruby "4.1.0.dev" yet (the version
# string parser produces an invalid Docker image tag). Skip rails-main and
# lock it separately with the host Ruby.
appraisal-run gemfiles/rails_7.1.gemfile gemfiles/rails_7.2.gemfile gemfiles/rails_8.0.gemfile gemfiles/rails_8.1.gemfile -- bundle lock
BUNDLE_GEMFILE=gemfiles/rails_main.gemfile bundle lock
変更後:
# BUNDLE_IGNORE_RUBY_VERSION is needed because the gemfiles declare ruby
# versions that don't match the local Ruby (e.g. 3.2, 3.3, 4.1.0.dev).
for gemfile in gemfiles/*.gemfile; do
BUNDLE_GEMFILE="$gemfile" BUNDLE_IGNORE_RUBY_VERSION=1 bundle lock
done
appraisal-run が Ruby 4.1.0.dev のバージョン文字列を正しく解析できなかったため、rails_main.gemfile のみを別処理していた従来の回避策が、BUNDLE_IGNORE_RUBY_VERSION=1 環境変数を使った統一ループに置き換えられています。新規 gemfile を追加してもスクリプトの修正が不要になり、保守性が向上します。
まとめ
ViewComponent 4.10.0 は eager_load = true 環境でのテスト起動エラーというピンポイントな不具合を修正したパッチリリースです。あわせてリリーススクリプトの BUNDLE_IGNORE_RUBY_VERSION 対応により、今後の複数 Rails バージョン向けロックファイル更新作業が一本化されています。