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

时间:2016-05-29 04:24:41

标签: ruby-on-rails rvm web-deployment rbenv capistrano3

我在尝试将ruby应用程序从repo推送到远程服务器时遇到了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

经过几个小时的故障排除并在interweb上搜索类似的错误消息后,我遇到了一个问题:使用rvm在本地计算机上安装ruby是一种常见做法,并将应用程序从repo推送到安装了ruby的远程计算机与rbenv。我的想法是“没有这样的文件或目录”错误意味着我的本地安装,基于它在本地安装的方式,正在寻找遥控器上的rvm文件夹,当它找不到它时会抱怨。

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

是否有一个黑客可以完成这项工作,而无需在本地和每个与之关联的宝石进行全面卸载,或者如this answer中所述,手动创建遥控器上的文件夹?老老实实地寻找最干净,最好的做法。非常感谢提前。

的Gemfile

# 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 }

配置/ 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

配置/部署/ 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

1 个答案:

答案 0 :(得分:1)

我不知道你的设置是否常见,但它应该是可能的。出于Capistrano的目的,它并不关心您是在本地使用rvm还是rbenv,仅在服务器上使用。因此,如果服务器上有rbenv,则需要capistrano-rbenv gem和Capfile配置,而不是capistrano-rvm gem。

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

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

我希望这有帮助!