Posted at

Rakeが引数を受け取ってくれない

More than 3 years have passed since last update.

rake taskに実行時オプションを渡すときは ENV を使って渡すと便利だけどなんでもかんでも使えるわけではないという話

task :superimportanttask do

if ENV["envvar"]
puts "set envvar: #{ENV["envvar"]}"
end

if ENV["env-var"]
puts "set env-var: #{ENV["env-var"]}"
end

if ENV["--envvar"]
puts "set --envvar: #{ENV["--envvar"]}"
end

if ENV["--env-var"]
puts "set --env-var: #{ENV["--env-var"]}"
end

if ENV["env_var"]
puts "set env_var: #{ENV["env_var"]}"
end
end

実行してみる

$ rake superimportanttask envvar=hoge

set envvar: hoge
$ rake superimportanttask env-var=hoge
rake aborted!
Don't know how to build task 'env-var=hoge'

(See full trace by running task with --trace)
$ rake superimportanttask --env-var=hoge
invalid option: --env-var=hoge
$ rake superimportanttask --envvar=hoge
invalid option: --envvar=hoge
$ rake superimportanttask env_var=hoge
set env_var: hoge

環境変数名の途中にハイフン(ダッシュ)が入るとタスク名として認識され、頭につくとrakeの実行オプションとして認識される。アンダーバーは大丈夫。そもそもRakeは定まった処理を実行するためのものとして利用されることが多いし、実行時オプションに依存するタスクが多いほど再現性が低下するのでやめた方がいいんじゃないのという話もある。