valid,invalid

関心を持てる事柄について

Gem の install / uninstall フックの使い方

Git hook を手軽に管理できる huskyRuby 版が欲しいかもと思い最近 rusky という gem を作っている。

github.com

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 ファイルに書いても動くようだが、一部環境では動かないようだ。

ハマっていた問題

こんな 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'

同僚の松島さんに使用例を教えてもらった

見比べて何が足りないかと思えば rubygems_plugin.rb 内で require 'rubygems' していなかったのが原因らしかった。足して見たところうまく動いた。とはいえ、うーん、require しないとこのへんで定義してるメソッドが読まれない?Gem class のこととかよくわかっていない。また、なぜ path や github オプションの指定ではうまく動くのかもわかっていないので時間あるときにコードを追いたい。

現状

手元のテスト用レポジトリでは上記のどの Gemfile の書き方でもうまく動いているようだ。