在部署到Heroku时,为什么Travis无法连接使用Redis cache_store?

我在我的Rails应用程序中使用Redis缓存:

config.cache_store = :redis_store, redis_url 

当我将我的Rails应用程序直接推送到Heroku时,它已成功部署。 使用Travis时,Heroku部署步骤失败,因为资产预编译尝试连接到Redis。

  Running: rake assets:precompile rake aborted! ArgumentError: invalid uri scheme '' /tmp/build_7c5f167bf750cb2986dbb9c3510ea11e/vendor/bundle/ruby/2.1.0/gems/redis-3.2.0/lib/redis/client.rb:390:in `_parse_options' 

我尝试了各种各样的事情:使用rake任务覆盖RedisStore方法,将cache_store实例化移动到初始化阶段,使用Docker而不是sudo,更改Heroku构建策略和其他travis.yml配置等。

我不想在本地预编译,我宁愿不改变缓存解决方案。 在雪松-14堆栈上运行的许多其他应用程序使用非常类似的设置,因此问题似乎有点特殊。

有关如何解决此Travis + Heroku部署问题的任何建议吗?

在我的例子中,我通过将redis init更改为:

 REDIS = Redis.new(:url => redis_url_string) 

以前我在解析URI并将参数传递为:

 uri = URI.parse(redis_url) REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password, :scheme => uri.scheme) 

我想知道缓存存储初始化是否有类似的redis初始化实现(我没有在那里检查源)。

我们通过覆盖Redis :: Store初始化来解决了这个问题。 使用Travis触发Heroku部署时,Redis Store会尝试连接到Redis。 这可能是由于Redis Store gem的当前版本(2013年11月)与当前资产管道实现不兼容。 直接推向Heroku的原因尚不清楚。 当使用travis.yml文件中指定的Heroku构建策略时,它可能与编译资产的顺序有关。 也许这些问题将在未来的Redis Store版本中得到解决。

这是用于避免在将Redis Store用作缓存存储(lib / assets / tasks / assets.rake)时加载Redis的rake任务:

 pt = Rake::Task['assets:environment'] Rake.application.send(:eval, "@tasks.delete('assets:environment')") namespace :assets do task :environment do class Redis class Store def initialize(options = { }) puts ”Do nothing" end end def initialize(options = { }) puts ”Do nothing" end end pt.execute end end 

这不是一个非常优雅的解决方案,但它现在可以解决问题。 请考虑更改缓存解决方案。