2012-09-14 19 views
9

Lệnh này là vấn đề của tôi:ray Chạy á quân với một số thông số

/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 cũng mất '--environment = sản xuất' như là đối số của nó, mà nên tranh luận kịch bản/Á hậu của.
Tôi đoán điều này có thể được giải quyết bằng cách sử dụng một số dấu ngoặc đơn, nhưng không có ý tưởng.

Nếu giải pháp không chạm (hoặc phụ thuộc vào) Rails hoặc môi trường toàn cầu của Linux, nó sẽ tốt hơn nhiều.

/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 

Trả lời

5

script/runner không mất một đường dẫn đến một tập tin, thay vì phải mất một số Ruby đó nó sẽ thực hiện:

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

Bạn luôn có thể thiết lập các môi trường Rails sử dụng một biến môi trường, ví dụ:

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

Nếu bạn muốn chạy một số nhiệm vụ phức tạp, bạn có thể viết tốt hơn là tác vụ Rake. Ví dụ, bạn có thể tạo ra các tập tin lib/tasks/foo.rake:

namespace :foo do 
    desc 'Here is a description of my task' 
    task :bar => :environment do 
    # Your code here 
    end 
end 

Bạn sẽ thực hiện điều này với:

rake foo:bar 

Và như với script/runner bạn có thể thiết lập các môi trường sử dụng một biến môi trường:

RAILS_ENV=production rake foo:bar 

Cũng có thể pass arguments to a Rake task.

4

Tôi giả sử bạn đang ở trên một Rails cũ dựa trên script/runner Tôi không biết điều này có hiệu quả đối với Rails cũ hay không, nhưng trong Rails mới hơn, bạn chỉ có thể require 'config/environment' và ứng dụng sẽ tải ứng dụng. Sau đó, bạn chỉ có thể viết kịch bản của bạn trong đó.

Ví dụ, tôi có một kịch bản mà có một đối số, in nó ra nếu nó được cung cấp, và sau đó in ra có bao nhiêu người sử dụng trong ứng dụng của tôi:

File: ứng dụng/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 

Calling không có args:

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

Calling với một tốc ký arg:

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

Gọi bằng tay dài arg:

$ be ruby app/jobs/my_job.rb --the-arg my_arg 
THE ARGUMENT WAS "my_arg" 
THERE ARE 2 USERS 
Các vấn đề liên quan