使用 Unicorn 实现无缝重启后,有时候会发现更新版本后的 Gem 没有生效,Rails 取的总是之前旧版本的 Gemfile.lock 文件来定位 Gem。 检查后发现是 config/boot.rb 中的 BUNDLE_GEMFILE 参数值不正确
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
假设现在第一次发布版本,版本目录为 2012051001,启动 Unicorn,ENV['BUNDLE_GEMFILE'] 的值为 2012051001/Gemfile 第二次发布版本,此版本更新了 haml 的版本,版本目录为 2012051002,在本地运行 cap deploy 命令无缝重启 Unicorn,这个时候 Unicorn 不会清除 ENV 中的 BUNDLE_GEMFILE 参数值,其值仍为 2012051001/Gemfile,导致 rails 在启动时使用的是旧版本的 haml
这时,可以手动把 Unicorn kill 掉,再重新启动,问题消失,但就做不到无缝重启了
Unicorn 文档有提供针对此问题的解决方法,修改 config/unicorn.conf.rb 配置文件,增加:
before_exec do |server|
ENV["BUNDLE_GEMFILE"] = "/u/apps/#{application}/current/Gemfile"
end
搜索 "unicorn BUNDLE_GEMFILE" 发现国外也有不少人中招,主要是使用 cap 清除旧的发布目录后,提示找不到 Gemfile