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らしさなのかもしれません。

Invitation from Wantedly, Inc.
If this story triggered your interest, have a chat with the team?
Wantedly, Inc.'s job postings
11 Likes
11 Likes

Weekly ranking

Show other rankings
Like Masaki Hara's Story
Let Masaki Hara's company know you're interested in their content