トップ «前の日記(2019/03/07 (木) ) 最新 次の日記(2019/03/09 (土) )» 編集 RSS feed

HsbtDiary


2019/03/08 (金) [長年日記]

RubyGems をマシンで全部共有して使うようにした

@a_matsuda と Asakusa.rb で rbenv みたいなやつを使ってる時に gem ってなんで共有できないんでしたっけ?という話をしていてなんでだっけなあと考えたら一つには $GEM_HOME/bin をPATHに通すというのを rbenv などで切り替えるたびにやる必要があるから、とかだけど、それはやればいいだけだしなあ...と特に決定打も無いので共有するようにしてみた。

本質的な課題としては、複数のアプリケーションやソフトウェアを開発していると 2.5.1, 2.5.3 など teeny バージョンごとにインストールされている gem がバラバラで、片方には入ってるけど片方には入ってない、みたいのがとにかくストレスなので gem ibundle i は一回だけにしたい、って感じ。

以下やったことです。

  • GEM_HOME=$HOME/.gem/share に設定
  • fish で最後に読み込まれるファイル、例えば zzz-path.fish などで $HOME/.gem/share/bin を rbenv の shims よりも手前に入れる
  • 2.5.1 など teeny は全部 2.5.0-dev などに symlink をはる

って感じで、あとは開発しながら gem を入れて、共有されて native extension がからの場合は pristine をして、というのを繰り返す。これやる中で、いくつか RubyGems の変な動きがたくさん出てきた、というのがイマココ。例えば

  • gem pristine --extensions を実行するとなぜか違う platform、例えば CRuby で実行しているのに java な gem を rebuild しようとして死ぬ
  • そして rebuild に失敗したら gem が uninstall される(ひどい)
  • CRuby と JRuby で同じバージョンの同じ gem、例えば nokogiri と nokogiri-java などを入れてる時に、 nokogiri を呼ぶ側で platform を制御できない。具体的には CRuby で実行してるのに java のバージョンが activate される

などなど...これ誰も使ってないんじゃねーの、という感じの不具合ばかりなので頑張って直そう...