2009-02-09 22 views
7

Tengo un script de Ruby en mi aplicación Rails que utilizo para cargar algunos datos de Twitter.¿Cómo puedo configurar el entorno de Rails para mi secuencia de comandos Ruby algo independiente?

En el futuro voy a hacer que sea un proceso automático en segundo plano, pero por ahora ejecutar de forma manual como:

ruby /lib/twitter/twitterLoad.rb 

Para utilizar los carriles de clases del modelo y tal, he lo siguiente como la parte superior línea de la secuencia de comandos:

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

De forma predeterminada, se utiliza el entorno de desarrollo. Pero, me gustaría poder elegir el entorno de producción en algún momento.

Actualización n. ° 1: La constante RAILS_ENV se establece en el archivo environment.rb. Entonces, pude poner ENV ['RAILS_ENV'] = 'producción' en la línea superior (antes de environment.rb) y resolver un poco mi problema. Entonces, mi nueva pregunta es: ¿pueden pasar los archivos a través de la línea de comando?

Respuesta

22

Si vas a utilizar el entorno de los carriles, la mejor opción sería la de hacer de este un guión rastrillo. Para ello, poner un archivo twitter.rake en lib/tareas y comenzar y terminar de esta manera:

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

De esa manera, lo estás haciendo por los siguientes convenciones "" y que doesn' Tiene ese olor orrible asociado.

0

añada la línea: RAILS_ENV = '<your environment of choice>'

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

pantulis: Es genial que eso funciona, pero para los rápidos sólo tiene que utilizar RAILS_ENV = '<your environment of choice>' ruby path/to/script.rb. Así es como configura las variables de entorno en la consola.

+0

que ya se está configurando en el archivo 'environment.rb', así aparece el siguiente error: lib/twitter/twitterLoad.rb: 11: advertencia: constante ya inicializada RAILS_ENV – messick

+0

Necesita agregar el requerimiento después de él. –

1

También puede hacer

script/consola de desarrollo < ruta/a/su/script.rb

-y Admiteddly engorroso escupir un montón de basura IRB después de evaluar todos y cada línea del script - pero funciona para Quickies y no tienes que recordar que maldita línea requiere.

Y no olvide que tal vez la forma más elegante de ampliar su aplicación con scripts que hacen cosas útiles es escribir tareas de Rake.

+0

Bueno, esto es solo algo temporal hasta que obtenga BackgrounDRB para ejecutar el script automáticamente. Por lo tanto, mientras kludgey, esto funcionaría por ahora. – messick

9

Actualmente uso el siguiente método, y sé que el entorno no tiene la extensión rb, no es necesario. También puede configurarlo antes de ejecutarlo para sobrescribir el 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!" 

continuación para cambiar el entorno, sólo ejecutarlo con:

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

Sí, después de que la respuesta de Aram causó un error constante de redefinición, esto es lo que intenté y funcionó. Pero, la respuesta de Pantulis me permite elegir qué entorno desde la línea de comando. – messick

+0

Puede establecer la constante al ejecutar el script también (también agregué un ejemplo dentro de la respuesta al principio) – Garrett

5

No se olvide de script/runner.

Establecer la variable de entorno de la línea de comandos y

ruby script/runner your_script_here.rb 
+0

¿Ventajas? Desventajas? ¿Sigue siendo relevante en Rails 3.0? –

+3

En 3.0+, use 'rails runner path/to/script'. Nota: la ruta a su script es relativa a su raíz de proyecto, no a su directorio de trabajo. –

1

La respuesta se acepta para utilizar rake es bien tomadas, pero es posible que desee establecer manualmente el medio ambiente para las pruebas de clases de utilidad.

Esto es lo que uso para configurar el entorno de prueba para clases de utilidad en /lib. Para estos, suelo usar la convención de Ruby de hacer que mi archivo de clase ejecute sus pruebas cuando se ejecuta desde la línea de comandos. De esta forma puedo hacer TDD fuera de los arneses de prueba centrados en web de Rails, pero aun así usar la clase dentro de rake sin afectar el entorno que establece.

Esto va en la parte superior:

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

y esto va en la parte inferior:

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 

esto funciona, pero sólo si el Gemfile de su script contiene todas las dependencias de su aplicación de rieles Es posible que pueda cargar un Gemfile de otro, por ejemplo, eval, para superar este copiar/pegar.

Cuestiones relacionadas