2012-09-14 8 views
9

Questo comando è il mio problema:rotaie in corso corridore con alcuni parametri

/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 prende anche `--environment = produzione' come argomento, che dovrebbe essere l'argomento script/del corridore.
Immagino che questo possa essere risolto usando alcune parentesi, ma non ho un'idea.

Se la soluzione non tocca (o dipende da) Rails o ambiente globale di Linux, sarebbe molto meglio.

/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 

risposta

5

script/runner non ci vuole un percorso di un file, invece ci vuole un po di Ruby che eseguirà:

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

È sempre possibile impostare l'ambiente Rails utilizzando una variabile d'ambiente, ad esempio:

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

Se si desidera eseguire un compito complesso, si può essere meglio scriverlo come un compito Rake. Ad esempio, è possibile creare il file lib/tasks/foo.rake:

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

Si potrebbe eseguire questo con:

rake foo:bar 

E come con script/runner è possibile impostare l'ambiente utilizzando una variabile d'ambiente:

RAILS_ENV=production rake foo:bar 

È anche possibile pass arguments to a Rake task.

4

Suppongo che tu sia su un vecchio Rails basato su script/runner Non so se questo funziona per le vecchie Rails 'o no, ma nei più recenti Rails, puoi solo require 'config/environment', e caricherà l'app. Quindi puoi semplicemente scrivere i tuoi script lì.

Ad esempio, ho uno script che prende un argomento, lo stampa fuori se è stato fornito, e quindi stampa quanti utenti sono nella mia app:

File: app/lavori/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 

Chiamata senza args:

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

chiamata con una scorciatoia ARG:

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

Chiamare con un ARG lunga mano:

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