トップ «前の日記(2023/10/10 (火) ) 最新 次の日記(2023/10/12 (木) )» 編集 RSS feed

HsbtDiary


2023/10/11 (水) [長年日記]

gem-ext-cleaner という RubyGems プラグインを作った

世界で僕くらいしか興味がないことなのだが、RubyGems の post_install フックを使って、不要な C 拡張ファイルを削除するプラグインを作ってみた

https://github.com/hsbt/gem-ext-cleaner

gem install gem-ext-cleaner で有効化されます。

背景については README に書いたつもりではあるけど、RubyGems(Bundler) は C 拡張を含む gem をインストールすると以下のようなパスにインストールされる。

$GEM_HOME/gems/extensions/$arch-$platform-$version/$rubyversion/foo-x.y.z
$GEM_HOME/gems/foo-x.y.z/lib

RubyGems 3.3 までは Working ディレクトリである $GEM_HOME/gems/foo-x.y.z/ext の下にも .so.bundle が残り続けるけど、これは RubyGems 3.4 では make clean で消えるようになったので、上記の2つから選ぶしかない。

で、上記のディレクトリはどちらも $LOAD_PATH に追加されており、どちらにも同じファイルが同じディレクトリ構造で存在しているので端的にディスクの無駄である。特に $GEM_HOME/gems/foo-x.y.z/libGEM_HOME を共有しているような環境では、Ruby のバージョンを変えたときに死んでしまうなど、プラットフォームやバージョンを扱うことができないので非常によくない。

個人的には $GEM_HOME/gems/extensions/$arch-$platform-$version/$rubyversion/foo-x.y.z が公式な C 拡張のディレクトリであって、これのみを使うようにすべき、と思っているけど、gem の中にはハードコードで lib の下を指して処理、具体的には ffi などを使っているものもあって、なかなか大変となっている。

で、このプラグインは、lib の下の .so.bundle を消しても動くのに問題ないよね、というのを確かめるために作ったもので、手元では今年に入ってから手元ではずっとこれで暮らしているけど困ってないので RubyGems のプラグインにもしてみた。Docker のイメージなどでとにかくサイズを減らしたい、という人は試してください。

最近の原神とスターレイル

スターレイルが PS5 で発売したのでインストールしておいた。基本、ソフトの値段はアイテム課金、みたいなものなのでいいとして相変わらずロードが速いというのと、オーディオが良かった気がする。ここしばらく、☆5キャラを引き続けていたので、当面はちまちまと育成素材集めで。

一方の原神はフォンテーヌで DPS とサポートの組み合わせを用意しておくかと思いヌヴィレットを引いておいた。

おそらく次のバージョンで水神が来るので、そこまでは PS5 の他のゲームをやりつつぼちぼちモード。