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

时间:2009-02-09 19:56:37

标签: ruby-on-rails ruby

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

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

ruby /lib/twitter/twitterLoad.rb

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

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

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

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

7 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:10)

我目前使用以下方法,我知道环境没有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

答案 2 :(得分:5)

不要忘记script/runner

从命令行和

设置环境变量
ruby script/runner your_script_here.rb

答案 3 :(得分:2)

使用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

答案 4 :(得分:1)

您也可以

脚本/控制台开发<路径/到/你的/ script.rb

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

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

答案 5 :(得分: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。这是在控制台中设置环境变量的方法。

答案 6 :(得分: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应用程序的所有依赖项时才有效。您可以从另一个Gemfile中加载一个Gemfile,例如eval,以克服此复制/粘贴。