RubyGems には gem pristine
というインストール済みのキャッシュを使ってもう一度インストールしなおす pristine コマンドがあり、この pristine に --extensions
をつけると C ext な gem だけ再インストールというか再ビルドすることができる。
つまり、rbenv each gem pristine --extensions
などと実行すると、インストールしている Ruby のバージョンすべてでリビルドができるようになる。そんなことしてどうすんの、というのは後日説明するとして、とにかく一度インストールした C ext をもう一度ビルドしたいというときに、ビルドされてない、または壊れているものだけをビルドしたいと思ってもそういうオプションがないので追加した。
https://github.com/rubygems/rubygems/pull/6446
内部を知っていれば割と簡単な方法なんだけど、意外となかったのが面白かった。誰も使っていない疑惑。なお、gem pristine の本体じゃない方法でやるとしたら以下のようなコードになる。
#!/usr/bin/env ruby
require "rubygems/commands/pristine_command"
Gem::Specification.select { |spec|
spec.platform == RUBY_ENGINE && spec.missing_extensions?
}.each do |s|
puts s.full_name
cmd = Gem::Commands::PristineCommand.new
cmd.options[:args] = [s.name]
cmd.options[:version] = s.version
cmd.execute
rescue Gem::Ext::BuildError, Gem::Package::FormatError, Gem::InstallError, Zlib::BufError
end
今週はこの辺の C ext な gem のインストールや $LOAD_PATH の解決方法などをガッツリ調べたのでだいぶ理解が進んだ気がする。頑張ろう。
地球の歩き方、日替わりの500円セールであったり、kindle unlimited にやたら出てくるので最近良く読んでいるのだけど、今回はベトナムを読んだ。
ベトナム、ハノイ、ホーチミンに加えて最近はダナンも盛り上がっていて、縦断で行ってみたいとは思うものの飛行機前提ぽくなかなか大変そう。勤務先のANDPADにはベトナムにブランチオフィスがあるので、なんかの機会があれば行きたい。Rubyのカンファレンス、誰かお願いします。