古いgemをインストールしようとすると警告を出すgemを作った
昨日メンテナンスされていないgemをインストールしてはまって大変だったので、インストールする際に古いgemだと警告を出すgemを作った。
1年以上メンテナンスされていなかったら警告を出すようにしている。1年という期間に特に理由があるわけではないんだけど、それだけ古かったら危ないだろうなあという直感。
rubygems.orgにも上げたので、以下のコマンドでインストール出来る。
$ gem install check-date
仕組み
RubyGemsにはインストール前/後、アンインストール前/後にフックを仕掛ける機能があり、今回のgemではそれを利用している。RubyGemsはrubygems_plugin.rbというファイルを探すので、そのファイルの中にフックや独自コマンドなどを記述するといいらしい。今回はフックを書きたかったので、ぐぐって見つけたRubyGems Plugin Hook Safety · GitHubを参考にした。
# lib/rubygems_plugin.rb require "rubygems/installer" require "check-date/hook"
フックの処理は以下のように書いている。インストールしようとしているgemの作成日が1年以上前だと警告を出す。Yを押すとそのままインストールを実行して、nを押すとabortするようにしている。
# lib/check-date/hook.rb Gem.pre_install do |installer| today = Time.now year_sec = 365 * 24 * 60 * 60 if (today - installer.spec.date) / year_sec > 1 then if !Gem::ConsoleUI.new.ask_yes_no("This gem was updated more than 1 years ago. (last update: #{installer.spec.date})\nInstall this gem?", true) then abort end end end
そんなに複雑なことをしているわけではないんだけど、ネット上を探してもGem.pre_installを使っているサンプルがあまりなく、どう書けばいいか調べるのが大変だった。