2009-02-09 80 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,以克服此複製/粘貼。