2009-02-09 79 views
7

我在我的Rails应用程序中有一个Ruby脚本,用于从Twitter加载一些数据。如何为我的独立Ruby脚本设置Rails环境?

在未来,我会让它自动后台进程,但现在我手动运行它像:

ruby /lib/twitter/twitterLoad.rb 

为了使用Rails的模型类和这样的,我有作为顶级以下脚本行:

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

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

更新#1:RAILS_ENV常量正在environment.rb文件中设置。所以,我可以将ENV ['RAILS_ENV'] ='production'放在最上面(位于environment.rb之前)行,并在一定程度上解决我的问题。所以,我的新问题是,可以通过命令行传递env变量吗?

回答

22

如果你打算使用Rails环境,最好的办法是使这个耙脚本。要做到这一点,把twitter.rake文件到的lib /任务并开始和结束它是这样的:由“以下约定”

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

这样一来,你这样做,并没有关系”没有那种可怕的气味。

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:警告:已经初始化常量RAILS_ENV – messick 2009-02-09 20:02:20

+0

您需要在它后面添加require。 – 2009-02-09 20:16:20

1

你也可以做

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

Admiteddly繁琐-and将评估每个和你的脚本的每一行后吐出大量IRB垃圾 - 但为快速工作,你不必记得该死的需要线路。

不要忘了,也许最优雅的方式来扩展你的应用程序与脚本,做有用的事情是写Rake任务!

+0

嗯,这只是一个暂时的事情,直到我让BackgrounDRB自动运行脚本。所以,虽然kludgey,现在可以工作。 – messick 2009-02-09 20:12:53

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

是的,在Aram的回答引起了一个重新定义的不断的错误之后,这就是我所尝试过的并且它的工作。但是,潘图利斯的回答让我选择了命令行中的哪个环境。 – messick 2009-02-09 20:17:40

5

别忘了script/runner

设置环境变量的命令行和

ruby script/runner your_script_here.rb 
1

接受的答案使用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 
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,以克服此复制/粘贴。