如何将以前的外部ruby脚本集成到Rails应用程序中并从rake任务中调用它们?

我有一些我在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中,我是否可以从rake任务中调用它们? 或者我需要在模型中require lib/my_script.rb的调用方法吗?

我试图写一个这样的任务:

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

然后,当这执行并且我在该script.rb(require’lib require 'lib/another_script.rb' )中有一个require ,我最终得到“无法加载此类文件”错误。

我现在显然是以错误的方式接近这个。

好像我应该在rake任务中简单地进行一个方法调用,然后调用/ lib或其他地方的支持脚本(在哪里最合适)。

我处理此类事情的首选方式如下:

  • 使用一种操作方法将每个脚本完整地包装在一个模块中
  • 将包含方法包装脚本的文件放在lib /中(您可以将多个方法脚本放在一个文件中,或者将它们保存为每个文件一个
  • 在Rakefile中需要lib中的所有内容
  • 在rake任务中,包括模块并调用方法

所以,用非常简单的术语:

 # 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 

我认为您的问题源于不需要正确的lib脚本路径。 而不是从您的脚本(位于lib中)执行require 'lib/another_script.rb' ,执行诸如require File.expand_path(File.dirname(__FILE__)) + '/another_script' 。 扩展路径将为您提供脚本的完整路径,因此ruby不应该在加载文件时遇到任何问题。