Git hook を手軽に管理できる husky の Ruby 版が欲しいかもと思い最近 rusky という gem を作っている。
gem install 時に Git hook スクリプトを自動生成し、uninstall 時には勝手に消してくれる感じにしたい。そんなわけで gem のインストールフックの使い方を学んだ。
知ったこと
走らせたいフックを rubygems_plugin.rb
というファイルに定義する。rubygems_plugin の話は Plugins - RubyGems Guides あたりに書いてある。
# lib/rubygems_plugin.rb require 'rubygems' Gem.post_install do |installer| # whatever you want end Gem.pre_install do |uninstaller| # whatever you want end
使えるフックは module Gem - Documentation for Ruby 2.4.0 あたりを参考にする。
これらのフックを gem_name.gemspec
ファイルに書いても動くようだが、一部環境では動かないようだ。
ハマっていた問題
lib/rubygems_plugin.rb に定義してる https://t.co/Xae2yRpoCc_intall フックが gem install 時や bundle install 時に実行されない… path 指定や github オプション指定だとうまくいく
— 広島の粗大ゴミ (@ohbarye) 2017年9月4日
こんな Gemfile を書いて色々テストしていた。
# test-repo/Gemfile source 'https://rubygems.org' # it doesn't work gem 'rusky' # it works # gem 'rusky', path: '/Users/ohbarye/.ghq/github.com/ohbarye/rusky' # it works # gem 'rusky', github: 'ohbarye/rusky'
同僚の松島さんに使用例を教えてもらった
— Fumiaki MATSUSHIMA (@mtsmfm) 2017年9月5日
見比べて何が足りないかと思えば rubygems_plugin.rb
内で require 'rubygems'
していなかったのが原因らしかった。足して見たところうまく動いた。とはいえ、うーん、require しないとこのへんで定義してるメソッドが読まれない?Gem
class のこととかよくわかっていない。また、なぜ path や github オプションの指定ではうまく動くのかもわかっていないので時間あるときにコードを追いたい。
現状
手元のテスト用レポジトリでは上記のどの Gemfile の書き方でもうまく動いているようだ。