我在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部署问题吗?
发布于 2015-01-30 11:40:23
我们通过重写Redis::Store初始化来解决这个问题。当使用Travis触发Heroku部署时,Redis Store尝试连接到Redis。这可能是由于Redis的当前版本(2013年11月)与当前的资产管道实现不兼容。直接推到Heroku的原因还不清楚。当使用travis.yml文件中指定的Heroku构建策略时,它可能与编译资产的顺序有关。也许这些问题将在未来的Redis版本中得到解决。
这是用于在使用Redis作为缓存存储时避免加载Redis的rake任务(lib/资产/任务/assets.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这不是一个非常优雅的解决方案,但它目前起了作用。请考虑更改缓存解决方案。
发布于 2015-01-22 18:37:36
在我的例子中,我通过将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)我想知道缓存存储init对于redis是否有类似的init实现(我还没有检查那里的源代码)。
https://stackoverflow.com/questions/28067644
复制相似问题