Chef で Ruby 2.4 を使っていて依存関係を解決した話
- td-agent のバージョンには 2, 3, 4 などがある
- fluent-plugin-bigquery に依存で google-api-client とかが入る
- required ruby version が 2.5
td-agent | Ruby |
---|---|
v4 | 2.7 |
v3 | 2.4 |
起こったこと
STDERR: ERROR: Error installing fluent-plugin-bigquery:
signet requires Ruby version >= 2.5.
chef でインストールバージョンを特に変更していないのに,fluent-plugin-bigquery
のインストールができなくなった.
Error は,requires Ruby version >= 2.5
.
確かに,今の td-agent の Ruby version は 2.4 なので満たせていないが,今までインストールできていた.
Require (Ruby) version を確認する
依存関係を確認する
例えば,1つの gem の require を確認するのは簡単だが,そこに至るrequire tree を確認しておかないとどういう解決をするか検討しにくい.
とりあえず,これは Require 2.5 なので無理.
検索してみたところ依存関係を再帰的に辿ってくれれるツールがあるらしい.
http://rubygems.org/ → https://rubygems.org/ にするだけで動く
どういう依存ツリーでそのパッケージ(Ruby 2.5 以上を必要としているかはこれでわかる)
required バージョンを確認する
$ ruby depsearch.rb fluent-plugin-bigquery | grep signet | sed -e 's/^ *//' | uniq
signet ~> 0.14
version 0.14.1 → 0.15 で変更になっている.
バージョン | 説明 |
---|---|
~> x.0 | x.1からx.9は良いが、メインのバージョンがあがるとは不可。例えば、3.2は良いが、4.0は不可など |
対応する
シンプルには,td-agent パッケージを v4 にすれば Ruby 2.7 になってOK そうだが,
td-agent パッケージを上げるのが少し面倒だった.
(td-agent が v4 に対応していないというのもある)
v3 のまま何かできないかと考えて,先に必要なgem をインストールしておけばrequired が満たされて新しいバージョンをインストールしようとしないだろうという想定.
$ gem install signet -v=0.14.1
大丈夫そうでした.
その他
バージョンチェックのツリーをバージョン指定して確認できるといいかも.
あと Ruby のバージョンのチェックも可能にしてもいいかもな.と思った.
gem.add_runtime_dependency "signet", "~> 0.14"
正直これが ~> 0.14.0
だったらなあ… とは思った