君の瞳はまるでルビー - Ruby 関連まとめサイト

rake でのコマンドライン引数の扱い

最終更新: 2015-03-31 (火) 21:53:19 (910d)

概要

rake コマンド実行時のコマンドライン引数を入力として受け取る方法についてまとめます。

以下の2つの方法があります。

  1. タスク毎に引数を定義し、受け取る。
  2. 環境変数経由で受け取る。

1. タスク毎に引数を定義し、受け取る

以下に Rakefile のサンプルを示します。

task :hello, 'firstname', 'lastname'
task :hello do |t, args|
  puts "Hello, #{args['firstname']} #{args['lastname']}"
end

実行する例を示します。

rake 'hello[John,Smith]'

task の記述が2行あります。

  • 1つ目の記述が引数の定義です。
  • 2つ目の記述がタスクの実行内容の定義です。

引数の指定は、実行時に

rake 'タスク名[第1引数,第2引数,...]'

という形で行います。

受け取りはタスクブロックの第2引数に渡ってくる Hash 経由で行います。Hash のキーは、引数の定義で指定した名前を使います。

2. 環境変数経由で受け取る

以下に Rakefile のサンプルを示します。

task :hello do |t|
  puts "Hello, #{ENV['firstname']} #{ENV['lastname']}"
end

実行する例を示します。

rake firstname=John lastname=Smith hello

引数の指定は、実行時に

rake 変数名1=値 変数名2=値 ... タスク名

という形で行います(変数の定義はタスク名より後でも可能なようです)。

受け取りは環境変数を表す ENV オブジェクト経由で行います。

それぞれの強み・弱み

それぞれトレードオフ(強み・弱み)があります。

それぞれの強み

  1. タスク毎に引数を定義し、受け取る。
    • 必要となる引数が明確である。
      • Rakefile の task を読むだけで引数が把握できる。
    • コマンドラインの指定を簡潔にできる。
      • 引数の名称の指定が不要で、短く記述できる。
  2. 環境変数経由で受け取る。
    • 引数の指定に柔軟性がある。
      • 環境変数が設定済みであればその値をデフォルト値として利用するなどの方法が採れる。
    • 全てのタスクで自由に引数の値が使える。
      • 環境変数はグローバル変数なので、どのタスクからもアクセスできる。

それぞれの弱み

  1. タスク毎に引数を定義し、受け取る。
    • 直接実行されるタスクしか引数を受け取れない。
      • 依存関係により起動されるタスクが引数を受け取れない。
      • 例えば default タスクによって起動されるタスクは引数を受け取れない。
  2. 環境変数経由で受け取る。
    • 引数の名称の指定が必要になる。
    • 必要となる引数が不明確である。
    • 引数の命名に注意を必要とする。
      • 環境変数の上書きなどが発生しないようにする。

考察

個人的に「2. 環境変数経由で受け取る」が好きです。

柔軟性があるし、タスクの依存関係も制約がなく自由に設定できます。

必要となる引数はドキュメントとしてまとめればわかりやすくなるでしょう。

コマンドを打つたびに長い変数名を書かなければならないという問題は、

  • 短い変数名を採用する。
  • デフォルト値を決めておく。
    • 環境変数を事前に設定する。
    • Rakefile で制御する。以下、事例。
task :hello do |t|
  firstname = ENV['firstname'] || 'John'
  lastname = ENV['lastname'] || 'Smith'
  puts "Hello, #{firstname} #{lastname}"
end
  • 専用の簡易スクリプトを作って利用する。以下、事例。
    • Windows の場合(バッチファイル)
@setlocal
@echo off
rake hello firstname=%1 lastname=%2
  • UNIX 系の場合(bash の alias)
alias hello="rake hello firstname=$1 lastname=$2"
  • UNIX 系の場合(sh)
#/bin/sh

rake hello firstname=$1 lastname=%2

で回避できると思います。

コメント

本ページの内容に関して何かコメントがある方は、以下に記入してください。

コメントはありません。 コメント/rake/arguments

お名前: