如何为我的独立Ruby脚本设置Rails环境?
我在我的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变量吗?
如果你打算使用Rails环境,最好的办法是使这个耙脚本。要做到这一点,把twitter.rake文件到的lib /任务并开始和结束它是这样的:由“以下约定”
task(:twitter_load => :environment) do
# your code goes here
end
这样一来,你这样做,并没有关系”没有那种可怕的气味。
添加一行: 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
。这是您如何在控制台中设置环境变量。
你也可以做
脚本/控制台发展<路径/到/你/ script.rb
Admiteddly繁琐-and将评估每个和你的脚本的每一行后吐出大量IRB垃圾 - 但为快速工作,你不必记得该死的需要线路。
不要忘了,也许最优雅的方式来扩展你的应用程序与脚本,做有用的事情是写Rake任务!
嗯,这只是一个暂时的事情,直到我让BackgrounDRB自动运行脚本。所以,虽然kludgey,现在可以工作。 – messick 2009-02-09 20:12:53
我目前使用以下方法,并且我知道环境没有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
是的,在Aram的回答引起了一个重新定义的不断的错误之后,这就是我所尝试过的并且它的工作。但是,潘图利斯的回答让我选择了命令行中的哪个环境。 – messick 2009-02-09 20:17:40
接受的答案使用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
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
,以克服此复制/粘贴。
已在'environment.rb'文件中设置,所以我得到以下错误:lib/twitter/twitterLoad.rb:11:警告:已经初始化常量RAILS_ENV – messick 2009-02-09 20:02:20
您需要在它后面添加require。 – 2009-02-09 20:16:20