miseによるプリコンパイル済みRubyのオプトインサポートを追加
Ruby Dev Container FeatureにusePrecompiledRubiesオプションが追加され、miseを通じてプリコンパイル済みRubyバイナリをオプトインで利用できるようになりました。デフォルトはソースビルドを維持しつつ、Rubyイメージでは明示的にプリコンパイル済みバイナリが有効化されています。
背景
miseはRubyをインストールする際にruby.compile設定でソースビルドとプリコンパイル済みバイナリを切り替えられますが、これまでRuby Featureはこの設定を制御する手段を提供していませんでした。ユーザーが任意のタイミングでプリコンパイル済みバイナリを利用するには、コンテナ内で直接mise settingsコマンドを実行するしかなく、Dev Container Featureの設定として一元管理できませんでした。
このPRはusePrecompiledRubiesオプションを導入することでこの問題を解消しています。特に、Rubyイメージ(images/ruby/)ではビルド時間の短縮が有益なため、このオプションが明示的に有効化されています。
技術的な変更
install.shにruby.compile設定を制御するロジックが追加され、miseのセットアップ時にプリコンパイル済みバイナリの使用可否を決定するようになりました。
変更前:
setup_mise() {
_user="$1"
su "$_user" -c "curl https://mise.run | sh"
# ...
}
変更後:
USE_PRECOMPILED_RUBIES="${USEPRECOMPILEDRUBIES:-"false"}"
setup_mise() {
_user="$1"
_use_precompiled_rubies="$2"
if [ "$_user" = "root" ]; then
_home_dir="/root"
else
_home_dir="/home/$_user"
fi
su "$_user" -c "curl https://mise.run | sh"
if [ "$_use_precompiled_rubies" = "true" ]; then
su "$_user" -c "$_home_dir/.local/bin/mise settings ruby.compile=false"
else
su "$_user" -c "$_home_dir/.local/bin/mise settings ruby.compile=true"
fi
# ...
}
usePrecompiledRubies=trueの場合はruby.compile=falseを、デフォルト(false)の場合はruby.compile=trueを明示的に設定することで、mise側のデフォルト設定に依存しない確定的な動作を保証しています。
devcontainer-feature.jsonにも対応する定義が追加され、featureのバージョンは2.1.4から2.2.0に更新されています。
"usePrecompiledRubies": {
"type": "boolean",
"default": false,
"description": "Use precompiled Rubies with mise when available"
}
Rubyイメージのdevcontainer.jsonでは、このオプションが明示的に有効化されています。
"ghcr.io/rails/devcontainer/features/ruby": {
"version": "${localEnv:RUBY_VERSION}",
"usePrecompiledRubies": "true"
}
設計判断
デフォルトをソースビルドに維持し、プリコンパイル済みバイナリをオプトインとする設計が採用されました。usePrecompiledRubiesのデフォルトはfalseであり、ruby.compile=trueが明示的に設定されます。
この設計には二つの重要な側面があります。第一に、既存ユーザーへの影響を排除した後方互換性の確保です。第二に、miseの将来的なデフォルト変更からFeatureの挙動を守る防御的プログラミングです。usePrecompiledRubiesがfalseの場合もruby.compile=trueを明示的に設定することで、miseのデフォルト値が変わっても動作が変化しない設計になっています。
また、テスト面でも同様の方針が徹底されています。features/test/ruby/test.shにmise settings | grep ruby.compile | grep trueのチェックが追加され、デフォルト動作がソースビルドであることを常に検証します。version_3_3_0.shと新設のwith_precompiled_rubies.shではruby.compile | grep falseで逆方向の検証を行い、オプトイン時の挙動も保証されています。
さらにこのPRでは、package.jsonの依存定義も整理されています。@devcontainers/cliのバージョン指定が^0.56.0から>= 0.84に変更され、js-yamlとsemverの依存が削除されました。package.jsonのnameもruby-version-scriptからrails-devcontainer-featuresに変更され、パッケージメタデータがリポジトリの実態をより正確に反映するようになっています。
まとめ
usePrecompiledRubiesオプションの追加により、miseのRubyインストール戦略をDev Container Featureの設定として宣言的に制御できるようになりました。デフォルトをソースビルドに固定しつつruby.compileを常に明示的に設定する設計は、miseの将来的な変更に対しても安定した動作を保証する堅牢なアプローチです。