ruby-on-rails - 如何让 Capistrano 3 使用 RVM ruby​​?

标签 ruby-on-rails capistrano capistrano3 rvm-capistrano

gem 文件:

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

头文件:
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 <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [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 的工作原理。

Here's the relevant code

capistrano-rvm 的工作原理是确定您的 RVM 安装位置,然后在您的 capistrano 命令前加上相关的 mapped commands .命令映射是 SSHKit 的一部分。

Capistrano-rvm 默认映射 gem rake ruby bundle到 rvm 前缀的版本。这意味着每当 capistrano 遇到命令时,例如以 execute :bundle 的形式它将替换它,例如~/.rvm/bin/rvm 2.1.1 do bundle
你已经完全回避了你人为的 execute_interactively 中的整个机制。 command 指定内联命令。事实上,通过设置自己的 SSH session ,您已经完全回避了 capistrano 的整体美感!

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

至于为什么cap production rvm:check正在显示 system是因为术语 system在这种情况下是重载的。在这种情况下,您认为这意味着“这是哪种 rvm 安装方案,/usr/local/rvm 安装或 ~/.rvm 安装”

它的实际含义来自 this code ,即它检查在 RVM 中列为当前 ruby​​ 的 ruby​​ 版本,在服务器上默认安装的 ruby​​ 称为系统 ruby

关于ruby-on-rails - 如何让 Capistrano 3 使用 RVM ruby​​?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22505265/

相关文章:

ruby-on-rails - 使用 Ruby 验证 Web Crypto SubtleCrypto key 签名

javascript - 永远重启 Node.js

ruby - 更改 Capistrano 策略

ruby-on-rails - Capistrano 部署后 Rails Assets 未编译

ruby-on-rails - 使用 rvm1-capistrano3 安装 Ruby

ruby-on-rails - 使用回形针 gem 从种子文件上传图像

ruby-on-rails - 为 rails 设置 sendgrid..returning 授权错误

ubuntu - EC2 Ubuntu Capistrano 问题(NoMethodError : undefined method `each' for "publickey":String)

ruby-on-rails - Capistrano: SSHKit::Command::失败:捆绑退出状态:1

ruby-on-rails - Rails - 不同的时区来限制每日帖子