【问题标题】:How to get Capistrano 3 to use RVM ruby?如何让 Capistrano 3 使用 RVM ruby​​?
【发布时间】:2014-03-19 12:04:05
【问题描述】:

宝石文件:

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 <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.

【问题讨论】:

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


    【解决方案1】:

    我认为您不了解 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 命令中完全避开了整个机制,该命令指定了内联命令。事实上,通过设置自己的 SSH 会话,您已经完全避开了 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​​ 版本为 current ruby​​,在服务器上默认安装的 ruby​​ 被称为 系统红宝石

    【讨论】:

    • 谢谢,这个答案让我去进一步调查 Cap3。我已经到了我的命令都可以工作的地步,但是控制台切换到检查模式 (gist.github.com/pawel2105/9706550)
    • “相关代码”是救命稻草!如果你在自己的位置而不是默认位置安装 RVM,你可以通过将它放在你的 deploy.rb 文件中告诉 rvm capistrano 插件:set :rvm_custom_path, '/my/custom/path/to/rvm'
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2012-05-10
    • 2010-12-31
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多