1
/
5

小ネタ: railsとpg gemのバージョン互換性

突然ですが、こんな場面に遭遇しました。

これは dependabot というボット(とても便利)が pg gemを自動でアップデートしようとしたときの結果です。CIが失敗していますが、これは rails を最新バージョンにすることによって解決しました。

さて、このCI failureは何が原因だったのでしょうか。これがその修正Pull Requestです。驚くべきはこの行 (修正前) です:

gem "pg", "~> 0.18"

0.18とsemver compatibleであることを要求しているので、 pg を 1.0.0 以上にすると動かなくなる、という原因でした。

「な〜んだ、普通じゃないか」と思うかもしれませんが、これ、なんとGemfileやgemspecではなくアプリケーションコードの一部です。なんでそんなことになっているのかは、この部分につけられたコメントで解説されています。つまり、

  • 本来はgemspecで指定するべき。
  • しかし、gemspecで指定すると、実際にはPostgreSQLが不要でも依存関係として導入されてしまう。(特に `pg` のように拡張をビルドするようなgemではあまり好ましくないですね)
  • したがって、ユーザー側で `pg` を依存に追加することを期待して、ActiveRecord側では実際にPostgreSQL adapterが使われたときだけ `pg` のバージョンをチェックする。

確かに、 rails に依存するだけでPostgreSQLが使えるようにするには、こうするしかなさそうです。でも、他に方法はなかったのでしょうか。それも、当該行のコメントで言及されています。つまり、 activerecord-pg のようなgemを作って、そこにアダプタを移動してしまうというわけです。ユーザーは pg ではなく activerecord-pg への依存を足すことになります。これならrubygemsがちゃんと面倒を見てくれそうです。

まあ、これもまたrailsらしさなのかもしれません。

Wantedly, Inc.では一緒に働く仲間を募集しています
12 いいね!
12 いいね!
同じタグの記事
今週のランキング
Wantedly, Inc.からお誘い
この話題に共感したら、メンバーと話してみませんか?