26
22

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とoptparseを組み合わせたら少し幸せになった

Last updated at Posted at 2015-01-26

鳥取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
26
22
3

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
26
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?