如何为我独立的Ruby脚本设置Rails环境?

我在我的Rails应用程序中有一个Ruby脚本,用于从Twitter加载一些数据。

将来我会把它变成一个自动后台进程,但是现在我手动运行它:

ruby /lib/twitter/twitterLoad.rb 

为了使用Rails模型类等,我将以下作为脚本的第一行:

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

默认情况下,使用开发环境。 但是,我希望能够在某个时候选择生产环境。

更新#1 :RAILS_ENV常量在environment.rb文件中设置。 所以,我能够将ENV [‘RAILS_ENV’] =’生产’放在最顶层(环境.rb之前)并解决我的问题。 那么,我的新问题是,可以通过命令行传入env变量吗?

如果您要使用rails环境,最好的办法是将其作为rake脚本。 为此,将twitter.rake文件放入lib / tasks中,然后以这样的方式开始和结束:

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

这样,你就是通过“遵循惯例”来做到这一点,并且它没有那种与之相关的难闻气味。

我目前使用以下方法,我知道环境没有rb扩展名,不需要它。 您也可以在运行它之前设置它以覆盖ENV["RAILS_ENV"]

 #!/ usr / bin / env ruby

 #在此处设置您的环境。
 ENV [“RAILS_ENV”] || =“生产”

要求File.dirname(__ FILE__)+“/../../config/environment”

把“Rails加载了!”

然后要更改环境,只需运行它:

  rb /lib/tasks/file.rb RAILS_ENV =开发 

不要忘记脚本/跑步者 。

从命令行设置环境变量

 ruby script/runner your_script_here.rb 

你也可以这样做

脚本/控制台开发

在评估你的剧本的每一行之后,他们会非常麻烦 – 并会吐出大量的垃圾垃圾 – 但是为了快速工作,你不必记住该死的需求线。

并且不要忘记,使用可以执行有用操作的脚本扩展应用程序的最优雅方法是编写Rake任务!

使用rake的公认答案很明确,但您可能仍希望手动设置测试实用程序类的环境。

这是我用来为/lib实用程序类设置测试环境的方法。 对于这些我倾向于使用Ruby约定,使我的类文件在从命令行运行时执行其测试。 这样我可以在Rails的以网络为中心的测试工具之外进行TDD,但仍然使用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 

添加以下行: RAILS_ENV = ''

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

pantulis:这很酷,但是对于快速我只需使用RAILS_ENV = '' ruby path/to/script.rb 。 这是您在控制台中设置环境变量的方法。

 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应用程序的所有依赖项。 您可能能够从另一个Gemfile加载一个Gemfile,例如只是eval它,以克服此复制/粘贴。