rake を yum でアップデートして、Passenger のワーカーをリスタートしたら、gem のバージョンコンフリクトで例外になった件。
あれこれ調べる前にたてた推測は、Spawner とかの常駐(?)している部分が抱えている rake が(メモリに)残ったまま、新しい rake が追加され、リスタートしたワーカー側で新しい rake を読み込もうとしたところ、gem のアクティベートに関する例外が発生した、というものです。
gem のアクティベートの例外メッセージは、ちょこちょこ見かけつつ、コードレベルで深追いしてこなかったので、適当に追いかけておきました。
KOSHIGOE学習帳 - [Ruby] Kernel.gem についてメモ
さて、気になっているのは、Passenger が Kernel.gem を使った gem の読み込みをしている様だということです。Apache のモジュールということでか、Ruby で書いたライブラリという事を忘れてしまっていたわけですが、Rails フレームワークを先読み(?)常駐(?)させる仕組みなわけだし、そもそも gem パッケージで配布されているわけだし、(Rails で使うリクエストハンドラとかの)Ruby コードを見た事があるわけだし、忘れてた自分が意味不明です。
まあ、なんと言いますか、「Web アプリケーションの部分で rake って使ってるんだ!?」という、個人的に盲点なところを突かれてまいったな、と。コンソールでの作業で rake が使われるのは分かるんですが、ウェブアプリケーション(Apache)の方に影響がある、というのがなんだかすっきりしません。
で、Passenger の gem パッケージの中を`ack "^[\s]*gem"`とかして探ってみると、テストコード以外では rails を Kernel.gem で読み込んでいる様です。
さて、gem のアクティベートについて調べた中で、依存関係にある gem もアクティベートする事を知りました。Rails をぼーっと使っているだけだったので、勝手にロードしてくれる事に慣れきって、Kernel.gem でやってくれる事の詳細に気が回っていなかったのは内緒です。
早速、以下のコードで、rails を Kernel.gem した場合に読み込まれるパッケージが何か調べてみました。
普通に、`gem dependency rails --version=2.1.2`とかして依存関係を調べるのと変わりませんね。
$ gem dependency rails --version=2.1.2 Gem rails-2.1.2 rake (>= 0.8.1, runtime) activesupport (= 2.1.2, runtime) activerecord (= 2.1.2, runtime) actionpack (= 2.1.2, runtime) actionmailer (= 2.1.2, runtime) activeresource (= 2.1.2, runtime)
type が runtime なやつが、Kernel.gem での依存解決(ロード)の対象になるんですね。多分。そこは詳しく見てませんが。
後は、Passenger の Spawner だか Pool だかの所と、ワーカーの所でのあれこれを調べれば、rake のバージョンコンフリクトがどのようにして発生したかが分かるはずです。が、疲れたので、これ以上は気が向いたときに調べようと思います。その日が来るか知りませんが。
今回の収穫は、Kernel.gem した時の動きを多少知れた事ですかね。そんな事すら知らなかった自分に絶望するのはいつもの事なので、もう気にしません。スルー力ってやつですね。


コメントする