ubuntuでsnapベースのrubyをインストールしてはまった


TL;DR

ubuntuでsnapベースのrubyをインストールしたけど、スクリプトの実行すらできない状況だった。
他経由(aptなど)でインストールしたrubyが悪さしてる可能性があるので、消すなりしましょう。

起きた現象

snapベースでインストールしたrubyでスクリプトを実行しようとすると下記のようなエラーが出て起動できなかった。

/snap/ruby/260/lib/ruby/3.1.0/rubygems.rb:1334:in `rescue in <top (required)>': undefined method `rubyforge_project=' for class `Gem::Specification' (NameError)
Loading the rubygems/defaults/operating_system.rb file caused an error. This file is owned by your OS, not by rubygems upstream. Please find out which OS package this file belongs to and follow the guidelines from your OS to report the problem and ask for help.
	from /snap/ruby/260/lib/ruby/3.1.0/rubygems.rb:1321:in `<top (required)>'
	from <internal:gem_prelude>:2:in `require'
	from <internal:gem_prelude>:2:in `<internal:gem_prelude>'
/usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb:50:in `<class:Specification>': undefined method `rubyforge_project=' for class `Gem::Specification' (NameError)
	from /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb:49:in `<top (required)>'
	from /snap/ruby/260/lib/ruby/3.1.0/rubygems.rb:1325:in `require'
	from /snap/ruby/260/lib/ruby/3.1.0/rubygems.rb:1325:in `<top (required)>'
	from <internal:gem_prelude>:2:in `require'
	from <internal:gem_prelude>:2:in `<internal:gem_prelude>'

いろいろめんどくさいので、anyenv/rbenvで逃げてたところ、 @hsbt さんから

というアドバイスをもらったので、試したらうまくいった。

aptベースでインストールされたruby関連パッケージの探し方

下記コマンドを実行したらrubyはなかったけど、いくつかruby関連のパッケージがあった。

% apt list --installed |grep ruby
ruby-net-telnet/focal,now 0.1.1-2 all [installed,auto-removable]
ruby-power-assert/focal,now 1.1.7-1 all [installed,auto-removable]
ruby-test-unit/focal,now 3.3.5-1 all [installed,auto-removable]
ruby-xmlrpc/focal,now 0.3.0-2 all [installed,auto-removable]
rubygems-integration/focal,now 1.16 all [installed,auto-removable]

aptベースのパッケージのアンインストール方法

% sudo apt remove パッケージ名

おまけ

snapとは

snapはUbuntuのCanonical社が開発しているパッケージシステムで、Dockerベースでパッケージ構成することで、ディストリビューションの依存関係を少なくできるというのがウリ(だけど今回ハマった…)

rbenvとは

rbenvはrubyのバージョン管理システムで、複数バージョンのrubyを切り替えることができる。

anyenvとは

XXenvをさらにまとめたもので、下記のようなXXenvに対応している

% anyenv install -l
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  jlenv
  luaenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
  tfenv

現場からは以上です。それではまたー。