部署 请教 Rails + Passenger + Capistrano 部署

flybee · 2018年10月06日 · 最后由 pynix 回复于 2018年10月06日 · 5941 次阅读

在线上开发环境下使用 rvm 安装 ruby,并且创建了该应用使用的 gemset 使用 capistrano/passenger 来进行启动/重启服务器,如何切换 gemset? 感觉没有啥好的方法来切换 gemset 啊

找到的 work around 的方法如下:

  1. 不使用专用的 gemset,而使用默认的 global gemset;
  2. 不使用 capistrano/passenger 来进行启动/重启服务器,在 deploy:publishing 之后加钩子,自己写启动命令;
  3. 改变 "[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm""的位置,将该语句放置在.bashrc 文件中(nonlogin bash 会加载.bashrc), 但是这样的话又会和 rvm1/capistrano3 有一定的冲突;(该方法感觉不纯洁了)
  4. 定制化启动 passenger, set :passenger_restart_command, "source $HOME/.bash_profile && cd #{release_path} && rvm use #{fetch(:rvm1_ruby_version)} && passenger-config restart-app" (该方法感觉也不纯洁了)

请问大家有啥方法没?

PS:使用 rvm1/capistrano3 可以保证在 bundle install 的时候,gem 的安装是正确的,可以安装到正确的 gemset 中(https://rvm.io/integration/capistrano文档的第一种方法)

个人感觉,rvm 和 capistrano 是本质上就冲突的,rvm 利用切换环境变量来使用 ruby 和 gemset,而 capistrano 是非登录 shell 的方式部署,本身就不会加载一些环境变量的 init 文件。

  1. 如果要看一个教程,我推荐 https://gorails.com/deploy/ubuntu/ ,这是我所知唯一能持续更新维护良好的教程。
  2. gemset 已经被 bundler 替代,可以弃用。我认为安装系统源里的 ruby 比用 rvm/rbenv 的更好管理,后两者经常要处理不同环境和工具的 PATH 的问题。
Rei 回复

是的,我感觉也是,在线上环境下使用 gemset 来管理 ruby gem 非常不方便,出了在自己的个人电脑上还行。推荐的文档不错!

中年程序员 rails app 部署之道。https://ruby-china.org/topics/36865

需要 登录 后方可回复, 如果你还没有账号请 注册新账号