Rake のタスクを消す (プライベートな gem のうっかり rake release を防ぐ) のようにすると rake release
による事故の心配が無くなるので安心だけど、 Git の tag を打つところだけは便利なので使いたい。
自前でそういうタスクを書くこともできるけど、せっかくなので Bundler の提供している機能を再利用してみる。
require "bundler/gem_tasks"
require "bundler/gem_helper"
t = Bundler::GemHelper.new
desc "Create tag #{t.send(:version_tag)}"
task :tag do
t.send(:tag_version) { t.send(:git_push) } unless t.send(:already_tagged?)
end
こういう感じにすると rake tag
で、
- Git の tag を打つ
- バージョン番号は gemspec ファイルから自動的に参照される
- gemspec ファイルが
lib/*/version.rb
の定数をみるようになっていればその値が使われる
- Git の tag をリモートに push する
- ついでに push してないコミットも push される
ということが自動的に行われる。
簡単にコードの解説をすると、
-
rake release
タスクなどで実行されるコードは Bundler のlib/bundler/gem_helper.rb
にあるのでそれを require する - 目的のメソッド
tag_version
とかは Bundler::GemHelper クラスの protected メソッドなのでsend
で呼び出す
といった感じ。 send
の多用を嫌う場合は Bundler::GemHelper のサブクラスを作って self.tag_version
などと呼び出してもいい。
なお、このコードは Bundler::GemHelper#release_gem をほぼそのままコピーしただけ。