2009-02-09 1 views
7

У меня есть скрипт Ruby в моем приложении Rails, который я использую для загрузки некоторых данных из Twitter.Как установить среду Rails для моего несколько самостоятельного скрипта Ruby?

В будущем я буду делать это автоматический фоновый процесс, но сейчас я запустить его вручную, как:

ruby /lib/twitter/twitterLoad.rb 

Для того, чтобы использовать Rails классы модели и такие, я следующий в верхней строка сценария:

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

По умолчанию используется среда разработки. Но я бы хотел в какой-то момент выбрать производственную среду.

Обновление # 1: Константа RAILS_ENV устанавливается в файле environment.rb. Таким образом, я смог поместить ENV ['RAILS_ENV'] = 'production' в самую верхнюю (до среды.rb) линию и немного решить мою проблему. Итак, мой новый вопрос, может пройти через env vars через командную строку?

ответ

22

Если вы собираетесь использовать среду рельсы, лучше всего было бы сделать это лопаточкой сценарий. Чтобы сделать это, поместите файл twitter.rake в Lib/задачи и начать и закончить это следующим образом:

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

Таким образом, вы делаете это на «следующих конвенций», и это Безразлично» t иметь этот «неприятный запах», связанный с ним.

0

добавьте строку: RAILS_ENV = '<your environment of choice>'

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

pantulis: Это здорово, что это работает, но для халтуры я просто использовать RAILS_ENV = '<your environment of choice>' ruby path/to/script.rb. Вот как вы устанавливаете переменные среды в консоли.

+0

, который уже установлен в файле 'environment.rb', поэтому я получаю следующую ошибку: lib/twitter/twitterLoad.rb: 11: warning: уже инициализированная константа RAILS_ENV – messick

+0

Вам необходимо добавить запрос после него. –

1

Вы можете также сделать

сценарий/консоль разработки < путь/к/вашим/script.rb

Admiteddly громоздким -И выложит много IRB мусора после оценки каждого и каждой строки вашего скрипта - но работает на быстрых, и вам не нужно помнить, что чертовски нужна линия.

И не забывайте, что, возможно, самый элегантный способ расширить ваше приложение с помощью скриптов, которые делают полезные вещи, - это писать задания Rake!

+0

Ну, это всего лишь временная вещь, пока я не получаю BackgrounDRB для автоматического запуска сценария. Итак, пока kludgey, это будет работать пока. – messick

9

В настоящее время я использую следующий метод, и я знаю, что среда не имеет расширения rb, она не нужна. Вы также можете установить его перед запуском, чтобы перезаписать 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!" 

Затем изменить окружающую среду, просто запустите его:

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

Да, после ответа Арама возникла переопределяющая постоянная ошибка, это то, что я пробовал, и это сработало. Но, ответ Пантулиса, позвольте мне выбрать, какая среда из командной строки. – messick

+0

Вы можете установить константу при запуске скрипта (я также добавил пример внутри ответа, а также изначально) – Garrett

5

Не забывайте, что script/runner.

Установите переменные среды из командной строки и

ruby script/runner your_script_here.rb 
+0

Преимущества? Недостатки? Все еще актуально в Rails 3.0? –

+3

В версии 3.0+ используйте 'rails runner path/to/script'. Примечание. Путь к вашему скрипту относится к вашему корню проекта, а не к вашему рабочему директорию. –

1

Принятого ответа использовать rake хорошо принято, но вы все равно хотите вручную настроить среду для тестирования служебных классов.

Вот что я использую для настройки тестовой среды для служебных классов в /lib. Для них я склонен использовать соглашение Ruby о том, чтобы мой файл класса выполнял свои тесты, когда он запускается из командной строки. Таким образом, я могу делать TDD за пределами веб-ориентированных тестовых жгутов Rails, но по-прежнему использовать класс в пределах rake, не затрагивая среду, которую он устанавливает.

Это идет в верхней части:

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

и это идет на дно:

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 

Это работает, но только если Gemfile вашего сценария содержит все зависимости вашего rails app. Возможно, вы сможете загрузить один Gemfile из другого, например, только eval, чтобы преодолеть эту копию/вставку.

Смежные вопросы