本地 rvm ruby 安装和远程 rbenv ruby 安装 - 它们可以共存吗?

local rvm ruby installation and remote rbenv ruby installation - Can they coexist?

我在尝试将 ruby 应用程序从存储库推送到远程服务器时 运行 进入 SSHKit::Runner::ExecuteError。

开启

$: bundle exec cap production deploy

我明白了

DEBUG [506a96fd] Running [ -d ~/.rvm ] as deploy@168.257.12.345
DEBUG [506a96fd] Command: [ -d ~/.rvm ]
DEBUG [506a96fd] Finished in 1.496 seconds with exit status 1 (failed).
DEBUG [8e553e85] Running [ -d /usr/local/rvm ] as deploy@168.257.12.345
DEBUG [8e553e85] Command: [ -d /usr/local/rvm ]
DEBUG [8e553e85] Finished in 0.074 seconds with exit status 1 (failed).
DEBUG [d6f82812] Running ~/.rvm/bin/rvm version as deploy@168.257.12.345
DEBUG [d6f82812] Command: ~/.rvm/bin/rvm version
DEBUG [d6f82812]    bash: /home/deploy/.rvm/bin/rvm: No such file or directory
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as deploy@168.257.12.345: rvm exit status: 127
rvm stdout: Nothing written
rvm stderr: bash: /home/deploy/.rvm/bin/rvm: No such file or directory

SSHKit::Command::Failed: rvm exit status: 127
rvm stdout: Nothing written
rvm stderr: bash: /home/deploy/.rvm/bin/rvm: No such file or directory

经过数小时的故障排除并在互联网上搜索类似的错误消息后,我开始思考使用 rvm 在我的本地计算机上安装 ruby 并将应用程序从 repo 推送到ruby 安装了 rbenv 的远程机器。我的想法是 "No such file or directory" 错误意味着我的本地安装,基于它在本地的安装方式,正在寻找远程上的 rvm 文件夹,当它找不到时它会抱怨。

我的下一步是使用 rbenv 在本地安装相同的 ruby 版本,但其他研究支持 rvm 与 rbenv 不兼容,您应该在使用 rbenv 之前删除所有 rvm 的痕迹。两者都安装在我的本地机器上。

是否有破解方法可以使这项工作无需在本地彻底卸载 rvm 以及与其关联的每个 gem,或者我是否按照 [=] 中的说明在遥控器上手动创建文件夹19=]?老实说,寻找最干净的最佳实践。非常感谢。

宝石文件

# Added per gorails.com tutuorial @ gorails.com/deploy/ubunt/14.04
gem 'capistrano', '~> 3.4.0'
gem 'capistrano-bundler', '~> 1.1.2'
gem 'capistrano-rails', '~> 1.1.1'

# Add this if you're using rbenv
# gem 'capistrano-rbenv', github: "capistrano/rbenv"

gem 'capistrano-rvm', github: "capistrano/rvm"

Capfile

require 'capistrano/setup'
require 'capistrano/deploy'

require 'capistrano/bundler'
require 'capistrano/rails'

require 'capistrano/rvm'

set :rvm_type, :user
set :rvm_ruby_version, '2.0.0-p451'

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

config/deploy.rb

lock '3.4.1'
set :application, 'my_app'
set :repo_url, 'https://github.com/my_acct/my_app.git'
set :deploy_to, '/home/deploy/#{my_app}'

namespace :deploy do
  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
    end
  end
end

config/deploy/production.rb

set :stage, :production
server '168.257.12.345', user: 'deploy', roles: %w{web app}

版本

ruby 2.3.1 (local and remote)
rbenv version 2.1.5
rvm 1.27.0

不知道你的设置是否通用,但应该是可以的。就 Capistrano 而言,它并不真正关心您是在本地使用 rvm 还是 rbenv,只在服务器上使用。因此,如果服务器上有 rbenv,则需要 capistrano-rbenv gem 和 Capfile 配置,而不是 capistrano-rvm gem.

您上面描述的错误是因为 Capistrano 正在尝试在远程服务器上查找 RVM。 capistrano-rvm|rbenv gem 存在的原因是因为当 Capistrano 与服务器建立 SSH 连接以 运行 安装时,它不会自动访问 bash 为您提供本地自动配置的扩展。所以 Capistrano 必须手动设置它。

根据您的本地计算机,rvm 和 rbenv 不兼容是正确的,您应该在安装 rbenv 之前删除 rvm 的所有痕迹,反之亦然。在继续了解 Capistrano 之前,我会确保您的本地安装已正确设置。

希望对您有所帮助!