@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Gem.ruby_api_versionについて

ruby.wasmの怪現象 - @ledsun blog についてrubygemsにissueつくるかー、と思って調べていたら・・・迷宮入りしました。 現状をメモしておきます。

背景

ruby.wasm では、Ruby VM 初期化直後に次のような状態で返ることがあります。

  • Gem は定義されている
  • rubygems.rb は未ロード
  • Gem.ruby_api_version / Gem.extension_api_version は未定義

WASI向けにbundle install --standalone で生成される bundler/setup.rb を使うときに問題になります。k

ruby.wasm 側ではワークアラウンドを PR #622 で入れてあります。

Bundler に立てようと思っているIssueの概要

Bundler の standalone generator は generated setup.rb の中で:

  • require "rbconfig" は行う
  • unless defined?(Gem) のときだけ Gem.ruby_api_version / Gem.extension_api_version の簡易実装を定義する

そのため、今回のように

  • Gem は defined
  • しかし RubyGems API surface は未完成

という状態だと、フォールバック定義が入らず、 Gem.ruby_api_version を前提にしているソースコードが壊れます。

関連コード: https://github.com/ruby/rubygems/blob/4758fb59f8f83695aac41e7dd1034c9042424a66/bundler/lib/bundler/installer/standalone.rb#L76

次のように個別にチェックすればいいのかな?とイメージしています。

def self.ruby_api_version
   RbConfig::CONFIG["ruby_version"]
 end unless respond_to?(:ruby_api_version)

def self.extension_api_version
  if "no" == RbConfig::CONFIG["ENABLE_SHARED"]
    "\#{ruby_api_version}-static"
  else
    ruby_api_version
  end
end unless respond_to?(:extension_api_version)

Bundlerの既存 Issue

Standalone bundle's setup.rb should implement Gem.try_activate to avoid breaking binding.irb · Issue #7545 · ruby/rubygems · GitHub が近いです。 standalone の setup.rb がpartial な Gem surface が問題を起こしています。

また、コメントで次のような設計案が出ています。

  • Gem.ruby_api_versionRbConfig.ruby_api_version に移せないか
  • Gem.extension_api_versionRbConfig 側に移せないか
  • Gem.* は将来的に deprecated にできないか

もし、これが実現すればアドホックにruby_api_versionを定義する必要が無くなります。 今回の問題の根本的な解決になりそうです。

bugs.ruby-lang.orgの既存議論

RbConfig.ruby_api_version の提案はありませんでした。

関連しそうな議論:

特に #6648 はとても長くて、議論に追いつけていません。 RbConfig.ruby_api_version を提案するなら、それなりに準備が必要そうです。

Gem.ruby_api_versionRbConfig::CONFIG["ruby_version"] の違い

Gem.ruby_api_versionGem.target_rbconfig["ruby_version"]を見ているようです。 これはクロスコンパイルと関係があるようですが、僕にはよくわかりません。

今のところ考えていること

とりあえず rubygems/rubygems にIssueを作るのは良さそうです。 あとは、せっかくRubyKaigiが近いので、RbConfigについての理解を深めておいて、誰かに直接相談したいところです。