- バックエンド / リーダー候補
- PdM
- Webエンジニア(シニア)
- 他19件の職種
- 開発
- ビジネス
突然ですが、こんな場面に遭遇しました。
これは 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らしさなのかもしれません。