2012-09-14 18 views
9

Este comando es mi problema:rieles El corredor corriente con algunos parámetros

/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 lleva también `--environment = producción' como su argumento, que debe ser argumento de la escritura/del corredor.
Supongo que esto se puede resolver usando algunos paréntesis, pero no tengo una idea.

Si la solución no toca (o depende de) Rails o el entorno global de Linux, sería mucho mejor.

/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 

Respuesta

5

script/runner no toma una ruta a un archivo, en lugar se necesita algo de Ruby que se ejecutará:

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

Siempre se puede configurar el entorno de Rails usando una variable de entorno, por ejemplo:

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

Si desea ejecutar una tarea compleja, que puede ser mejor de la escritura como una tarea Rake. Por ejemplo, puede crear el archivo lib/tasks/foo.rake:

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

Se podría ejecutar esto con:

rake foo:bar 

Y como con script/runner puede establecer el entorno utilizando una variable de entorno:

RAILS_ENV=production rake foo:bar 

También es posible pass arguments to a Rake task.

4

Supongo que está en un Rails anterior basado en script/runner No sé si esto funciona para Rails anteriores o no, pero en Rails más nuevos, puede simplemente require 'config/environment', y se cargará la aplicación. Entonces puedes simplemente escribir tus scripts allí.

Por ejemplo, tengo un script que toma un argumento, lo imprime si se proporcionó, y luego imprime cuántos usuarios están en mi aplicación:

del archivo: app/trabajos/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 

Llamada sin argumentos:

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

Llamando con una taquigrafía arg:

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

Llamando con una arg largo mano:

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