2012-03-30 47 views
4

安装Resque宝石和运行一个工人我的应用程序现在生产的资产管道错误后在Heroku上配置Resque:如何使用Rails 3.1和资产管道

萨斯:语法错误:要导入的文件找不到或无法读取

我创建了一个新分支,并将问题缩小到运行Resque worker。我只更改了三个文件。下面是重现步骤:

1)添加Resque宝石的Gemfile:

gem 'resque' 

2)创建Resque rake任务:

# lib/resque.rake 

require 'resque/tasks' 

task "resque:setup" => :environment do 
    ENV['QUEUE'] = '*' 
    Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection } 
end 

3)工人添加到Procfile :

web: bundle exec rails server -p $PORT thin 
worker: bundle exec rake resque:work 

我有一种感觉,问题是工作人员试图加载我所有的资产。我不想要,因为它只是一个后台进程。我甚至没有运行Resque前端,所以问题与此无关。

+1

是'config.assets.initialize_on_precompile'设置为false? – 2012-03-31 22:21:10

回答

5

罪魁祸首竟是我Resque初始化:塞编译时预编译:

if Rails.env.staging? || Rails.env.production? 
    uri = URI.parse ENV['REDISTOGO_URL'] 
    Resque.redis = Redis.new :host => uri.host, :port => uri.port, :password => uri.password 
end 

Heroku的运行资产。在预编译期间,环境被加载,但Heroku不通过ENV变量。 URI分析行失败,因为

ENV['REDISTOGO_URL'] 

为零。这导致资产:预编译rake任务失败。

的解决方案是增加:

config.assets.initialize_on_precompile = false 

您application.rb中的文件。

这是从Rails 3.1.1开始提供的,当设置为false时,编译资产时将不再加载环境。大多数时候这是一个安全的选择。

谢谢尼尔指着我在正确的方向。

0

在Rails 4中,不推荐使用initialize_on_precompile选项。

我遇到了与Rails 4应用程序相同的问题,并且决定如果未设置REDISTOGO_URL配置var(例如,在assets:precompile期间),则不需要创建Redis连接。所以我改变了我的redis.rb:

if ENV.include?('REDISTOGO_URL') 
    uri = URI.parse(ENV["REDISTOGO_URL"]) 
    REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) 
end