16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

rake release のうち tag を打つ機能だけ抜き出して使う

Posted at

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 をほぼそのままコピーしただけ。

16
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?