Gentoo Linuxでのrubyのバージョン管理について
少し前の記事
と関連した話です。
・rdocの更新がこける
emerge -uDN worldの過程でrdocの更新が入りました。
通常,rubyを入れるとruby23がまず入るわけですが,当環境では最新版のruby25までemergeしています。ruby25を入れるとついでにruby24も入ることになります。(特別なことをしない限り)
ruby23でmikutterを使えることを確認して,上記リンクのような対策を行いruby25でもmikutterを使える状態にしていました。
この状態でrdocをemergeすると次のような問題が起こります。
rdocはruby23,ruby24,ruby25全てに依存しています。
各バージョンに応じたgemを使ってビルドすることになる。
今の運用だとruby24は入れただけでほとんど空の状態なので,ruby24のコンフィグフェーズでgemが足りなくてこけてしまいます。
前回の話では,rubyのバージョンに対するbundleのgemが正常に反映されないということでしたが,今回は大元の各バージョンのgemが足りなくて怒られるという話です。
対策としては,
①ruby24に切り替えてから足りないgemを補う
②ruby24もUSEフラグに追加し,gemパッケージを再emergeする
実際,行ったことは,
①eselect ruby set 2(ruby24)
gem install rake markdown kpeg
②USE="ruby24" emerge kpeg
③eselect ruby set 3(ruby25に戻す)
実際は,rdocのエラー内容を見ながらあれこれ対処するしかないです。
gem install kpegだけでいけると思ったのですが,USEを追加してemergeしないとうまくいかないのは意外でした。
・rubyのバージョン管理
Gentooではeselectによりrbenvなどを用いなくてもバージョン管理が出来るのが特徴ですが,それゆえにbundlerの指定がruby23と固定のバージョンだったりしたときにバージョン管理がうまくいってないことが気付きにくいこともあります。
このような状態でエラーが出た場合,エラー内容を見てもなんでエラーになっているか非常に分かりにくいです。
そのため,バージョン管理に関しては予め理解をしておく必要があります。
まとめると,こんな感じ?
①eselectによるバージョン管理
②そのバージョンに応じたgem
③そのバージョンに応じたbundler
④bundlerに応じたgem
⑤各gemが参照しているrubyのバージョンを確認
⑥上記gem達がglobalを参照しているのかlocalを参照しているのか
一番楽なのは,各gemにrubyで関連付けて,eselectでバージョン管理することですね。
bundlerしか確認していませんが,他のgemも最初に入れたruby23を参照してたらかなり面倒ですね。
bundlerに関しては,前回の記事ではruby25に変更と書きましたが,rubyに変えた方が良いと思います。(今はrubyにしてる)
Gentoo初心者による記事でありますが,ここらへんの話って検索しても一般的なことしか出てこないんですよね(rbenvとかbundler単体の話しか出てこない)
結果的には同じことだと思いますが,Gentooのeselectで管理しようと思ったときに各gemパッケージがどのような参照になっているかは通常の管理と中身が異なってくることもあるかもしれません。
また,gemコマンドでgemパッケージを追加するのが普通ですが,Gentooの場合mikutterなどを入れるとgemのパッケージ自体がemergeでどさっと入ってくるので管理が複雑になりがちです。
と同じようなことで悩んだことがある人が全くいないわけではないだろうと言うことで私なりにまとめてみました。
アウトプット力がゴミに等しく分かりにくい文章だと思いますが,頭の中に確かな情報はあるので分かりにくい箇所に質問などあれば気軽にしてください。