gpt4 book ai didi

ruby-on-rails - Capistrano 部署到系统范围的 RVM 看不到已安装的 Rubies

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:12 25 4
gpt4 key购买 nike

我在我的服务器上使用系统范围的 Ruby 安装,并尝试部署到 RVM gemset(比如 rvm use 1.9.2@gemset_name)

当我运行我的 Cap 文件时,Cap 呕吐并说没有安装 Ruby。

但是,实际上安装了 Ruby。 (部署用户是 rvm 组的一部分,可以在命令行上手动 rvm use。)

我可能做错了什么?

Capfile相关部分

$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # Add RVM's lib directory to the load path.

require "bundler/capistrano"
require "rvm/capistrano"
require "erb"

set(:rvm_type) { :system }
set(:ruby_version) { '1.9.2' }
set(:rvm_ruby_string) { "#{ruby_version}@#{application}" }
set(:rvm_path) { "/usr/local/rvm" }
#set(:rvm_bin_path) { "#{rvm_path}/bin" }

before "deploy:setup", "rvm:debug_gemset"
before "deploy:setup", "bundle:install_gem"

namespace :rvm do
desc "Creates gemset for application"
task :debug_gemset do
disable_rvm_shell do
run "/usr/local/rvm/bin/rvm list rubies" do |ch, stream, data|
if stream == :err
logger.debug "capured output on STDERR: #{data}"
else # stream == :out
logger.debug "capured output on STDOUT: #{data}"
end
end
end
end
end

# We need this so that we can install rvm first!
def disable_rvm_shell(&block)
default_shell = self[:default_shell]
self[:default_shell] = nil
yield
self[:default_shell] = default_shell
end

上限输出

* executing `deploy:setup'
triggering before callbacks for `deploy:setup'
* executing `rvm:debug_gemset'
* executing "/usr/local/rvm/bin/rvm list rubies" # <----- ran outside of rvm-shell
servers: ["XX.XXX.XXX.XXX"]
Password:
[XX.XXX.XXX.XXX] executing command
* capured output on STDOUT:
* capured output on STDOUT: rvm rubies
* capured output on STDOUT:
* ruby-1.8.7-p352 [ x86_64 ]
* capured output on STDOUT:
* ree-1.8.7-2011.03 [ x86_64 ]
* capured output on STDOUT:
* ruby-1.9.2-p290 [ x86_64 ]
*

好的,太棒了:1.9.2 已安装。 (这是意料之中的 - 我手动安装了 1.8.7、REE 和 1.9.2!)

但这并不是 Capistrano 所说的全部...

    command finished
* executing `bundle:install_gem'
* executing "gem install bundler"
servers: ["XX.XXX.XXX.XXX"]
[XX.XXX.XXX.XXX] executing command
** [out ::XX.XXX.XXX.XXX] WARN: ruby ruby-1.9.2-p290 is not installed.

最后一行声称 1.9.2 未安装?!!

 ** [out ::XX.XXX.XXX.XXX] To install do: 'rvm install ruby-1.9.2-p290'
*** [err ::XX.XXX.XXX.XXX] ERROR: Gemset 'MY_APP' does not exist, rvm gemset create 'MY_APP' first.
*** [err ::XX.XXX.XXX.XXX] Error: RVM was unable to use '1.9.2@MY_APP'
command finished
failed: "rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell '1.9.2@MY_APP' -c 'gem install bundler'" on XX.XXX.XXX.XXX

使用帽壳调试

Jim Gay 问道,“用 cap shell 调试怎么样?”

rvm/capinstrano 通过 rvm-shell 运行命令,它会在执行命令之前立即查找版本和 gemset。 (因此我们之前定义的 disable_rvm_shell 用于执行初始 rvm list rubies

例如:

cap> which rvm
[establishing connection(s) to XX.XXX.XXX.XX]
Password:
** [out :: XX.XXX.XXX.XX] WARN: ruby ruby-1.9.2-p290 is not installed.
** [out :: XX.XXX.XXX.XX] To install do: 'rvm install ruby-1.9.2-p290'
*** [err :: XX.XXX.XXX.XX] ERROR: Gemset 'MY_APP' does not exist, rvm gemset create 'MY_APP' first.
*** [err :: XX.XXX.XXX.XX] Error: RVM was unable to use '1.9.2@MY_APP'
error: failed: "rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell '1.9.2@MY_APP' -c 'which rvm'" on XX.XXX.XXX.XX

结论

我显然做错了什么,但是什么?

将 1.9.2 设置为默认的 Ruby 不是一个选项,因为我还将在这个盒子上托管一个 1.8.7 应用程序(理想情况下)。这就是我一开始在系统级使用 RVM 的原因)。

根据 RVM 文档,我还确保部署用户在 RVM 组中。

最佳答案

关于未安装 ruby​​ 的警告是误导性消息,它应该说找不到 ruby​​@gemset 对。如果您要在服务器上使用此命令:

rvm use 1.9.2@MY_APP

您会以相反的顺序看到消息 - 第一个错误是找不到 gemset,要解决它请转到服务器并运行:

rvm --create use 1.9.2@MY_APP

这将为您创建一个 gemset,如果您需要更多帮助,请联系 FreeNode 服务器上的 IRC channel #rvm。

关于ruby-on-rails - Capistrano 部署到系统范围的 RVM 看不到已安装的 Rubies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6949014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com