2009-02-09 9 views
7

Ho uno script Ruby nella mia app Rails che utilizzo per caricare alcuni dati da Twitter.Come posso impostare l'ambiente Rails per il mio script Ruby un po 'autonomo?

In futuro mi renderà un processo automatico in background, ma per ora mi eseguirlo manualmente come:

ruby /lib/twitter/twitterLoad.rb 

Per poter utilizzare le rotaie classi del modello e così, ho il seguente come il top riga dello script:

require "#{File.dirname(__FILE__)}/../../config/environment.rb" 

Per impostazione predefinita, viene utilizzato l'ambiente di sviluppo. Ma mi piacerebbe essere in grado di scegliere l'ambiente di produzione ad un certo punto.

Aggiornamento n. 1: la costante RAILS_ENV viene impostata nel file environment.rb. Quindi, sono stato in grado di mettere ENV ['RAILS_ENV'] = 'production' in cima (prima della riga environment.rb) e risolvere il mio problema in qualche modo. Quindi, la mia nuova domanda è, posso passare in env vars attraverso la linea di comando?

risposta

22

Se avete intenzione di utilizzare l'ambiente di rotaie, la soluzione migliore sarebbe quella di rendere questo uno script rastrello. Per fare questo, inserire un file twitter.rake in lib/task e iniziare e finire in questo modo:

task(:twitter_load => :environment) do 
    # your code goes here 
end 

In questo modo, si sta facendo da "seguenti convenzioni" e doesn' Ho quell'odore orribile associato ad esso.

0

aggiungere la riga: RAILS_ENV = '<your environment of choice>'

http://wiki.rubyonrails.org/rails/pages/Environments#script

pantulis: E 'bello che funziona, ma per quickies mi basta usare RAILS_ENV = '<your environment of choice>' ruby path/to/script.rb. Ecco come si impostano le variabili d'ambiente nella console.

+0

che è già stato impostato nel file 'environment.rb' in modo da ottenere il seguente errore: lib/twitter/twitterLoad.rb: 11: avviso: costante già inizializzata RAILS_ENV – messick

+0

È necessario aggiungere il requisito dopo di esso. –

1

si può anche fare

script/console sviluppo < path/to/la vostra/script.rb

-e Admiteddly ingombrante sarà sputare fuori un sacco di spazzatura IRB dopo aver valutato ogni linea dello script - ma funziona per sveltina e non devi ricordare che dannati richiedono la linea.

E non dimenticare che forse il modo più elegante per estendere la tua app con script che fanno cose utili è scrivere attività Rake!

+0

Bene, questa è solo una cosa temporanea finché non avrò BackgrounDRB per eseguire automaticamente lo script. Quindi, mentre kludgey, questo funzionerebbe per ora. – messick

9

Attualmente utilizzo il seguente metodo e so che l'ambiente non ha l'estensione rb, non è necessario. Puoi anche impostarlo prima di eseguirlo per sovrascrivere lo ENV["RAILS_ENV"].

 
#!/usr/bin/env ruby 

# Set your environment here. 
ENV["RAILS_ENV"] ||= "production" 

require File.dirname(__FILE__) + "/../../config/environment" 

puts "Rails was loaded!" 

Poi, per cambiare l'ambiente, basta eseguirlo con:

rb /lib/tasks/file.rb RAILS_ENV=development
+0

Sì, dopo che la risposta di Aram ha causato un errore costante di ridefinizione, questo è quello che ho provato e ha funzionato. Ma, risposta di Pantulis, lasciami scegliere quale ambiente dalla riga di comando. – messick

+0

È possibile impostare la costante anche durante l'esecuzione dello script (ho aggiunto un esempio anche all'interno della risposta inizialmente) – Garrett

5

Non dimenticare script/runner.

Impostare la variabile d'ambiente dalla riga di comando e

ruby script/runner your_script_here.rb 
+0

Vantaggi? Svantaggi? Ancora rilevante in Rails 3.0? –

+3

In 3.0+, usare il percorso 'rails runner/to/script'. Nota: il percorso del tuo script è relativo alla tua radice del progetto, non alla tua directory di lavoro. –

1

La risposta accettata da usare rake è bene-presa, ma si può ancora voglia di impostare manualmente l'ambiente per testare classi di utilità.

Ecco cosa utilizzo per configurare l'ambiente di test per le classi di utilità in /lib. Per questi tendo ad usare la convenzione Ruby per far sì che il mio file di classe esegua i suoi test quando viene eseguito dalla riga di comando. In questo modo posso eseguire TDD al di fuori dei cablaggi di test web-centricali di Rails, ma utilizzare comunque la classe entro rake senza influire sull'ambiente che imposta.

Questo va in alto:

if (__FILE__ == $0) 
    ENV['RAILS_ENV'] ||= 'test' 
    require File.join(File.dirname(__FILE__),'../config/environment.rb') 
end 

e questo va in fondo:

if (__FILE__ == $0) 
    require 'test/unit/ui/console/testrunner' 
    Test::Unit::UI::Console::TestRunner.run(MyClassTest) 
end 
0
require 'bundler' 
require 'bundler/setup' 

ENV['RAILS_ENV'] ||= 'development' 

RAILS_ROOT = Pathname.new(File.expand_path('~/path/to/root')) 

puts "Loading Rails Environment from #{RAILS_ROOT}..." 
require RAILS_ROOT.join('config/environment').to_s 

questo funziona, ma solo se il Gemfile dello script contiene tutte le dipendenze del vostro app per rotaie. Potresti riuscire a caricare un Gemfile da un altro, ad esempio solo eval, per superare questa copia/incolla.

Problemi correlati