Как интегрировать ранее внешние скрипты ruby ​​в приложение Rails и вызывать их из задачи rake? - PullRequest
1 голос
/ 16 февраля 2012

У меня есть несколько дополнительных сценариев, которые я написал вне моего приложения Rails 3.1.x, однако пришло время получать данные из базы данных приложения Rails напрямую, а не использовать некоторые операции экспорта данных.

Для этого я хотел бы интегрировать скрипты в мое приложение rails.До сих пор я запускал задачи rake, основанные на методах в моделях, таких как наличие этого в моем lib/taks/app.rake:

desc "Does something."
task :do_some_things => :environment do
  ModelName.some_method
  ModelName.another_method
end

Если бы я по существу поместил свои скрипты в lib, я бы смог вызвать ихс граблями?Или мне нужен вызывающий метод в модели, который будет require lib/my_script.rb?

Я попытался написать задачу, подобную этой:

task :run_me => :environment do
  `bundle exec lib/script.rb`
end

Затем, когда это выполняется, и у меня есть require внутри этого script.rb (require 'lib/another_script.rb') В итоге я получаю ошибки «не могу загрузить такой файл».

Я, очевидно, сейчас подхожу к этому неверно.

Кажетсякак если бы я просто вызывал метод в задаче rake, который затем вызывал бы вспомогательные сценарии в / lib или в другом месте (где бы это ни было наиболее подходящим).

Ответы [ 2 ]

5 голосов
/ 16 февраля 2012

Мой предпочтительный способ обработки такого рода вещей следующий:

  • завернуть каждый скрипт целиком в модуль одним методом действия
  • Поместите файл, содержащий сценарий, заключенный в метод, в lib / (вы можете поместить несколько скриптов метода в один файл или оставить их по одному на файл
  • требует все внутри lib в вашем Rakefile
  • в грабли, включите модуль и вызовите метод

Итак, очень просто:

# lib/foo.rb
module Foo
  def bar
    puts "called me"
  end
end

и

# Rakefile
require File.expand_path('../config/application', __FILE__)
Dir[
  File.expand_path(Rails.root.join 'lib', '**', '*.rb')
].each {|f| require f}

desc "does bar from lib"
task :do_bar do
  include Foo
  bar
end
2 голосов
/ 17 февраля 2012

Я думаю, что ваша проблема связана с тем, что вам не нужен правильный путь к вашим библиотекам. Вместо того, чтобы делать require 'lib/another_script.rb' из вашего скрипта (который находится в lib), сделайте что-то вроде require File.expand_path(File.dirname(__FILE__)) + '/another_script'. Расширение пути даст вам полный путь к сценарию, поэтому у ruby ​​не должно возникнуть проблем с загрузкой файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...