鳥取Ruby会【とっとるびー】 第17回の「「RubyとRakeとリモート実行」の発表でいいこと聞いたのでまとめてみた。
Rakeのバージョンによる挙動について
[2015/02/19追記]
コメントで教えていただいたのだがrake 10.4.0以降でここに書いたオプションの受け渡しができなくなっている。
ARGVに"--"が含まれているのが原因なので以下のような感じで一応対応可能
opt.parse!(ARGV.reject { |x| x == "--" })
Rakeの引数の問題
今まで以下のようにRakeタスクの引数でオプション指定がしにくいのが不満だった。
タスクの引数を使う方法
$ rake test[moge]
確実に渡す引数は良いがオプションが複数あると渡しにくい。
1番目以降の引数でオプションだけを指定する場合、以下のような感じになってしまう。
$ rake test[,,plain]
$ rake test[,verbose]
環境変数を使う方法
$ rake test format=plain
どの環境変数を指定できるかわからない。
タスクのdescにもかけるが長々しくなるしコードを修正すると追随して修正しなければならず面倒くさい。
幸せになる方法
以下のようなRakefileを実行してみる。
require 'optparse'
desc 'test task'
task :test do |task|
OptionParser.new do |opt|
opt.on('--hoge=VALUE', 'hoge option') { |v| p v }
opt.parse!(ARGV)
end
end
普通にオプションを指定するとrakeのオプションとして認識されてしまう。
$ rake test --hoge=moge
invalid option: --hoge=moge
ハイフンを2回続けるとrakeのオプション解析はそこまでで止めてくれてタスクにくわせられる!
※ ここらへんに書いてあるの見つけた。optparseの機能?
$ rake test -- --hoge=moge
"moge"
ヘルプも出せる!
これでどんなオプションが指定できるかわかる!
でも、Usage: rake [options]になってる。
$ rake test -- --help
Usage: rake [options]
--hoge=VALUE hoge option
1行追加してみる。
require 'optparse'
desc 'test task'
task :test do |task|
OptionParser.new do |opt|
opt.program_name = "#{opt.program_name} #{task.name} --" # <= 追加
opt.on('--hoge=VALUE', 'hoge option') { |v| p v }
opt.parse!(ARGV)
end
end
綺麗に出た!
$ rake test -- --help
Usage: rake test -- [options]
--hoge=VALUE hoge option
おまけ:capistrano3でも幸せになる
capistrano3ではrakeが使われているので同様のことが行える。
以下のような感じでオプションが指定できる。
$ bundle exec cap production test -- --hoge=moge
helpは以下のような感じで綺麗に出せる。
require 'optparse'
task :test do |task|
OptionParser.new do |opt|
opt.program_name = "#{opt.program_name} #{task.application.top_level_tasks.join(" ")} --" # <= helpのUsage用
opt.on("--hoge=VALUE", "hoge") { |v| p v }
opt.parse!(ARGV)
end
end