Ben*_*min 10 ruby linux bash command-line ruby-on-rails
这个命令是我的问题:
/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`.
Run Code Online (Sandbox Code Playgroud)
my_job.rb也需要`--environment = production'作为参数,这应该是script/runner的参数.
我想这可以用一些括号来解决,但没有一个想法.
如果解决方案没有触及(或依赖于)Rails或Linux的全局环境,那就更好了.
/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
Run Code Online (Sandbox Code Playgroud)
script/runner 不会采用文件的路径,而是需要执行一些Ruby:
script/runner "MyClass.do_something('my_arg')"
Run Code Online (Sandbox Code Playgroud)
您始终可以使用环境变量设置Rails环境,例如:
RAILS_ENV=production script/runner "MyClass.do_something('my_arg')"
Run Code Online (Sandbox Code Playgroud)
如果您想运行一些复杂的任务,最好将其作为Rake任务编写.例如,您可以创建文件lib/tasks/foo.rake:
namespace :foo do
desc 'Here is a description of my task'
task :bar => :environment do
# Your code here
end
end
Run Code Online (Sandbox Code Playgroud)
您可以执行以下操作:
rake foo:bar
Run Code Online (Sandbox Code Playgroud)
与script/runner您一样,您可以使用环境变量设置环境:
RAILS_ENV=production rake foo:bar
Run Code Online (Sandbox Code Playgroud)
也可以将参数传递给Rake任务.
我假设您使用的是较旧的 Rails,script/runner因为我不知道这是否适用于较旧的 Rails,但在较新的 Rails 中,您只需require 'config/environment',它就会加载应用程序。然后你就可以在那里写你的脚本了。
例如,我有一个脚本,它接受一个参数,如果提供了就打印出来,然后打印出我的应用程序中有多少用户:
文件:app/jobs/my_job.rb
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
Run Code Online (Sandbox Code Playgroud)
无参数调用:
$ be ruby app/jobs/my_job.rb
THERE ARE 2 USERS
Run Code Online (Sandbox Code Playgroud)
使用 arg 简写调用:
$ be ruby app/jobs/my_job.rb -t my_arg
THE ARGUMENT WAS "my_arg"
THERE ARE 2 USERS
Run Code Online (Sandbox Code Playgroud)
使用 arg 长手调用:
$ be ruby app/jobs/my_job.rb --the-arg my_arg
THE ARGUMENT WAS "my_arg"
THERE ARE 2 USERS
Run Code Online (Sandbox Code Playgroud)