关于ruby:使用一些参数运行rails runner

Running rails runner with some parameters

这个命令是我的问题:

1
2
3
/usr/local/bin/ruby **script/runner** --environment=production app/jobs/**my_job.rb** -t my_arg

`my_job.rb` is my script, which handles command line arguments. In this case it is `-t my_arg`.

my_job.rb还将`--environment=production'作为其参数,这应该是script/runner的参数。我想这可以用括号来解决,但没有一个主意。

如果解决方案不接触(或依赖)Rails或Linux的全球环境,它会更好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/usr/local/lib/ruby/1.8/optparse.rb:1450:in `complete': invalid option: --environment=production (OptionParser::InvalidOption)
  from /usr/local/lib/ruby/1.8/optparse.rb:1448:in `
catch'
  from /usr/local/lib/ruby/1.8/optparse.rb:1448:in `complete'

  from /usr/local/lib/ruby/1.8/optparse.rb:1261:in `parse_in_order'
  from /usr/local/lib/ruby/1.8/optparse.rb:1254:in `
catch'
  from /usr/local/lib/ruby/1.8/optparse.rb:1254:in `parse_in_order'

  from /usr/local/lib/ruby/1.8/optparse.rb:1248:in `order!'
  from /usr/local/lib/ruby/1.8/optparse.rb:1339:in `
permute!'
  from /usr/local/lib/ruby/1.8/optparse.rb:1360:in `parse!'

  from app/jobs/2new_error_log_rt_report.rb:12:in `execute'
  from app/jobs/2new_error_log_rt_report.rb:102
  from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `
eval'
  from /home/www/maldive/admin/releases/20120914030956/vendor/rails/railties/lib/commands/runner.rb:46
  from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'

  from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
  from script/runner:3


script/runner不采用文件路径,而是采用一些Ruby来执行:

1
script/runner"MyClass.do_something('my_arg')"

您始终可以使用环境变量设置Rails环境,例如:

1
RAILS_ENV=production script/runner"MyClass.do_something('my_arg')"

如果你想运行一些复杂的任务,最好把它写为rake任务。例如,您可以创建文件lib/tasks/foo.rake

1
2
3
4
5
6
namespace :foo do
  desc 'Here is a description of my task'
  task :bar => :environment do
    # Your code here
  end
end

您可以执行此操作:

1
rake foo:bar

script/runner一样,可以使用环境变量设置环境:

1
RAILS_ENV=production rake foo:bar

也可以将参数传递给rake任务。


我假设您使用的是基于script/runner的旧的Rails,我不知道这是否适用于旧的Rails,但是在新的Rails中,您可以只使用require 'config/environment',它将加载应用程序。然后你可以在那里写你的脚本。

例如,我有一个脚本,它接受一个参数,打印出它是否提供,然后打印出我的应用程序中有多少用户:

文件:app/jobs/my_job.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
require 'optparse'

parser = OptionParser.new do |options|
  options.on '-t', '--the-arg SOME_ARG', 'Shows that we can take an arg' do |arg|
    puts"THE ARGUMENT WAS #{arg.inspect}"
  end
end

parser.parse! ARGV

require_relative '../../config/environment'

puts"THERE ARE #{User.count} USERS" # I have a users model

不带参数调用:

1
2
$ be ruby app/jobs/my_job.rb
THERE ARE 2 USERS

用arg速记键呼叫:

1
2
3
$ be ruby app/jobs/my_job.rb -t my_arg
THE ARGUMENT WAS"my_arg"
THERE ARE 2 USERS

用一只大长手呼叫:

1
2
3
$ be ruby app/jobs/my_job.rb --the-arg my_arg
THE ARGUMENT WAS"my_arg"
THERE ARE 2 USERS