【Ruby/Rake】非Rails環境でRakeタスクを作る

Rakeといえは、RubyでかけるMakefileのようなもの。
しかし、私はMakefileを書いたことがないので、単にRubyでちょっとしたタスクをコマンドとして呼び出せる便利ツールくらいに思っている。

このRakeだが、タスクの追加方法や設定等について調べて出てくるのはどうしてもRails環境が多い。
railsは内部的にはRakeを呼んでいる(?)っぽいので、しょうがないといえばしょうがないが、素のRubyでRakeタスクを作って実行する方法をメモしておく。

準備

Rakeといっても、Gemとして配布されている。
default gemとしてすでに入っているとは思うが、必要であればGemfileに入れてあげるとよい。

gem "rake"

そしてbundle install
ほかのGemと同じなので困ることはないはず。

Rakefile

基本的にはRakefileにタスクを追加してあげればよい。
Railsと同じようにlib/tasks/*.rakeという感じでタスクを個別のファイルで定義したい場合はRakefileに以下のように書いてあげればよい。

Dir["./lib/tasks/*.rake"].sort.each {|file| load file}

注意としては、requireではなくloadということ。
Railsさんも、内部でload使っているし、そういうことです。
(#TODO: 理由は後ほど調べる)

個別のタスク

個別は、普通にタスクを定義してあげればよい。

 namespace :task do
   # シンプルなタスク
   desc "test"
   task :test do
     puts "test task!"
   end
   
   desc "引数ありの場合"
   task :arg_task, [:hoge] do |_, args|
     puts args[:hoge]
   end
 end

ファイル名ごとにnamespaceを切ってあげると、タスク名に困ることはなくなると思います。

そして、rakeタスクを実行するときに引数を渡して実行することができます。
例えば、bundle exec rake task:arg_task[hogehoge]とするとコマンドラインから値を渡すことができます。

二つ目のタスクの通り、タスク名の後に配列で引数の名前を付けてあげる。
そしてブロックに2つの変数を作ってあげて、二つ目の変数に引数が入ってくるので指定した名前でアクセスすると取得できます。

まとめ

今回は、非Rails環境でRakeタスクを追加する方法をメモしておきました。
覚えておくと、ちょっとしたコマンドをRuby/Rakeで作れるので便利です。

RakeタスクはRails環境でしか使ったことがなかったので、素のRubyでも使えることが分かったのと、
ついでに実行時に引数を渡す方法もわかったので、簡単なコマンドをRakeで実装できるようになりました。
Rubyで良しなにスクリプトを書いた後、コマンドっぽく実行したいときに使えそうですね。

今回はここまで。
おわり。

Ruby

Posted by shikiyura