2008年 01月 04日

Rakefile で shipit ぽいの

require "shipit"

Rake::ShipitTask.new do |s|
	s.Ask
	s.Step.new {
		puts "prepare phase"
	}.and {
		puts "run phase"
	}
	s.Twitter "Notice to twitter"
end

Rake::ShipitTask.new do |s|
	s.Ask
	s.Task :test
	s.ChangeVersion
	s.Commit
	s.Task :clean, :package
	s.RubyForge
	s.Step.new {

	}.and {
	}
	s.Twitter
end

みたいに書けるやつは書いてみた ( http://coderepos.org/share/browser/lang/ruby/misc/shipit.rb )。gem にするか悩む

Rakefile つかう場合、基本的にはタスクをつくって、依存関係まとめて、だけでも問題ないんだけど、それだと途中で例外が発生したときに哀しいことになりやすいので、準備のフェーズと実行のフェーズ (外部への副作用がある処理) を分離するようにしてみた (もちろん完全に例外が発生しないようにはできない)。例えば twitter や rubyforge のアカウント設定が正しいか、とかを準備の段階でチェックしておけば、バージョン変更してコミットするまえにわかるので、別の環境で「アカウント設定しわすれてたー」「あーこっちもー」みたいなのはなくなる。


s. かくのがめんどいけど (instance_eval つかっても先頭が大文字なので定数あつかいになる)、 Rakefile は普通コピペでつくるので (cutagem とか new なんとかとか)、多少冗長でもいいし、リリースの順序なんて一回かいたらそんなに更新しないので、ちょっとめんどうくさい、ぐらいならいいかなぁ。

もっと簡単に

namespace :shipit do
	task :twitter do
	end

	task :twitter_prepare do
	end
end

みたいにして、命名規則で依存関係を自動でつくる、みたいなののほうがいいかなぁ……

あーだめだ。これだと引数をわたしにくい……

コピペビリティ重要 (処理がまとまっている)