LoginSignup
2
1

More than 5 years have passed since last update.

Rails runner <filename.rb> → Syntax error ナンデ!?

Posted at

ファイルパスを指定しているのにコードとして実行されてしまい(当然ファイルパスを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 で呼び出せることが分かった。(勉強になった)

2
1
0

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
2
1