如何让 Capistrano 3 使用 RVM ruby​​?

2024-02-19

Gemfile:

gem 'capistrano', '~> 3.0.0'
gem 'capistrano-rails'
gem 'capistrano-bundler'
gem 'capistrano-rvm'
gem 'capistrano3-puma'

部署.rb:

set :rvm_type, :user
set :rvm_ruby_version, '2.1.1'
set :default_env, { rvm_bin_path: '~/.rvm/bin' }

生产.rb

namespace :rails do
  desc "Open the rails console on primary app server"
  task :console do
    on roles(:app), primary: true do
      execute_interactively "#{current_path}/script/rails console RAILS_ENV=production"
    end
  end

  def execute_interactively(command)
    cmd = "ssh -l deploy 255.255.255.255 -p 21 -t 'cd #{deploy_to}/current && #{command}'"
    info "Connecting to 255.255.255.255"
    exec cmd
  end
end

Capfile:

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rvm'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano/puma'
require 'whenever/capistrano'
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

当我跑步时cap production rvm:check输出是:

rvm 1.25.19 (master) by Wayne E. Seguin <[email protected] /cdn-cgi/l/email-protection>, Michal Papis <[email protected] /cdn-cgi/l/email-protection> [https://rvm.io/]
system
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

不应该使用user代替system因为我已经指定了rvm_type?

当我跑步时cap production rails:console然后我得到:

INFO Connecting to 255.255.255.255
/usr/bin/env: ruby: No such file or directory
Connection to 255.255.255.255 closed.

我认为您不了解 capistrano-rvm 的工作原理。

这是相关代码 https://github.com/capistrano/rvm/blob/v0.1.1/lib/capistrano/tasks/rvm.rake#L38

capistrano-rvm 的工作原理是找出 RVM 安装的位置,然后在 capistrano 命令前加上相关的前缀映射命令 https://github.com/capistrano/sshkit#the-command-map。命令映射是 SSHKit 的一部分。

Capistrano-rvm 默认地图宝石耙红宝石捆绑包 https://github.com/capistrano/rvm/blob/v0.1.1/lib/capistrano/tasks/rvm.rake#L51到以 rvm 为前缀的版本。这意味着每当 capistrano 遇到命令时,例如形式为execute :bundle它将替换为,例如~/.rvm/bin/rvm 2.1.1 do bundle

你已经在你的设计中完全回避了整个机制execute_interactivelycommand 指定内联命令。事实上,通过设置您自己的 SSH 会话,您已经完全回避了 capistrano 的整体魅力!

还有整个set :default_env, { rvm_bin_path: '~/.rvm/bin' }根本不需要,这就是您使用 capistrano-rvm gem 的原因。


至于为什么cap production rvm:check正在显示system是因为这个词system在这种情况下是过载的。什么you认为在这种情况下它的意思是“这是什么类型的rvm设置方案,一个/usr/local/rvm安装或~/.rvm安装”

它的实际含义是来自这段代码 https://github.com/capistrano/rvm/blob/v0.1.1/lib/capistrano/tasks/rvm.rake#L9,即它检查 RVM 中列出的 ruby​​ 版本当前红宝石,服务器上默认安装的 ruby​​ 称为系统红宝石

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Capistrano 3 使用 RVM ruby​​? 的相关文章

随机推荐