2012-09-14 8 views
9

Dieser Befehl ist mein Problem:Laufschienen Läufer mit einigen Parametern

/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 nimmt auch `--environment = Produktion‘ als Argument, das Skript/Läufer Argument sein sollte.
Ich denke, dass dies mit einigen Klammern gelöst werden kann, aber keine Ahnung haben.

Wenn die Lösung die globale Umgebung von Rails oder Linux nicht berührt (oder davon abhängt), wäre es viel besser.

/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 

Antwort

5

script/runner nehmen keinen Pfad zu einer Datei, sondern es einige Ruby-nimmt, dass es ausgeführt wird:

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

Sie immer die Rails-Umgebung eine Umgebungsvariable verwenden, beispielsweise festlegen können:

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

Wenn Sie einige komplexe Aufgabe ausführen möchten, können Sie besser dran, es als Rake Aufgabe zu schreiben. Zum Beispiel könnten Sie die Datei lib/tasks/foo.rake erstellen:

rake foo:bar 

Und wie bei script/runner Sie die Umgebung mit einer Umgebungsvariablen einstellen::

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

du mit ausführen würde

RAILS_ENV=production rake foo:bar 

Es ist auch möglich, pass arguments to a Rake task.

4

Ich nehme an, Sie sind auf einem älteren Rails basierend auf script/runner Ich weiß nicht, ob dies für ältere Rails funktioniert oder nicht, aber in neueren Rails können Sie nur require 'config/environment', und es wird die App geladen. Dann kannst du deine Skripte einfach dort schreiben.

Zum Beispiel habe ich ein Skript, das ein Argument nimmt, druckt es aus, wenn es zur Verfügung gestellt wurde, und dann ausdruckt, wie viele Benutzer in meiner Anwendung sind:

Datei: 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 

Aufruf ohne argumente:

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

mit einer arg Stenografie Aufruf:

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

mit einer arg langen Hand aufrufen:

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