ファイルパスを指定しているのにコードとして実行されてしまい(当然ファイルパスをRubyコードとして実行してもSyntaxがおかしいので)Syntax error
になってしまう問題に暫く頭を悩ませてしまっていた。
結論から言うと、ファイルパスが不正(ファイルが存在しない) 場合にこのようなエラーになる。
それが何故このようなエラーになるかと言うと、 railties/commands/runner.rb
の実装が次のようになっているからだ。(※現時点master
での実装)
if File.exist?(code_or_file)
$0 = code_or_file
ARGV.replace(file_argv)
Kernel.load code_or_file
else
begin
eval(code_or_file, binding, __FILE__, __LINE__)
rescue SyntaxError, NameError => error
$stderr.puts "Please specify a valid ruby command or the path of a script to run."
$stderr.puts "Run '#{self.class.executable} -h' for help."
$stderr.puts
$stderr.puts error
exit 1
end
end
ファイルとして存在する場合は、それを読み込み実行する。そうでない場合は文字列を eval
する。
てっきり正規表現で /.*\.rb/
にマッチングでもさせているのかと思ったらそうではなかった。コマンドヘルプにも、
$ rails r -h
Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
とだけ書かれているので、てっきり文字列でマッチングしているのかと思っていた。
困ったときは(オープンソースなのだから)元の実装を見てみるに限る。
そして別に .rb
でマッチさせている訳ではないので、ファイルとして存在していれば .rb
以外の拡張子でも rails runner
で呼び出せることが分かった。(勉強になった)