关系RubyGems、Ruby版本、Bundler版本、RVM和Capistrano冲突

问题描述 投票:0回答:1

我有一个古老的 Ruby on Rails 项目,它使用 Capistrano 安装过程。它当前运行 Ruby 2.5.1 和 Rails 5.2。我一直在开发更新版本,但这样做可能弄乱了旧的安装。现在我需要修复 Capistrano 部署过程以在迁移到新情况之前安装修复程序。

我使用rvm来管理不同的Ruby版本。

在我的本地计算机上,该应用程序使用

ruby
2.5.1、
gem
3.2.3、
bundle
1.17.3 运行良好。这也是 Gemfile.lock 中声明的捆绑版本。

在服务器上,有

ruby
2.5.1、
gem
2.7.6 和
bundle
1.16.1。 (rvm 也已安装。)部署时,我收到错误消息
rubygems.rb:289:in 'find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
。事实上,在当前目录(仍在运行的软件版本)中运行
gem list bundle
告诉我,
bundle
当前的版本是1.16.1。但是,当前运行的软件版本的 Gemfile.lock 表明它与 1.17.3 捆绑在一起。

我想我应该在服务器上安装

bundle
1.17.3,因为它似乎确实没有安装(在 /home/deploy/.rvm/gems/ruby-2.5.1/gems/ 中)。但是,我认为在开始在正在运行的生产服务器上安装东西之前,我应该清楚我在做什么,因此我的问题。

  • gem
    (RubyGem)版本如何与Ruby版本连接?我的机器和服务器上列出的版本似乎表明 RubyGems 版本应该与 Ruby 版本匹配。这是真的吗?
  • gem
    (RubyGems)的版本是如何确定的? (我的猜测:rvm 可以做到这一点,但是如何实现?)我特别感兴趣的是版本 2.7.6 是如何到达服务器的,因为 Ruby 2.7.6 没有安装。
  • RubyGems 的版本有何不同?我在这一点上找不到任何东西。有时互联网对于搜索来说是一场噩梦。
  • 为什么 Capistrano 不安装 Gemfile.lock 中提到的捆绑程序版本?它是否安装
    gem
    (RubyGems),如果是,它如何知道要安装哪个版本?
  • 尽管服务器上没有安装
    bundle
    1.17.3,但上次 Gemfile.lock 已经有“BUNDLED WITH 1.17.3”信息时,我是如何成功部署的,为什么会中断安装现在?

最后,更多的是因为我总是感到困惑:

  • 为什么叫“bundler”和“RubyGems”,而我运行的程序却叫“bundle”和“gem”?我能找到的唯一说法是“bundle”是“bundler”的 CLI 工具,但是除了 CLI 工具之外,“bundler”还有什么?
ruby-on-rails ruby rubygems rvm capistrano
1个回答
0
投票

什么是 RubyGems?

RubyGems 是一个随 Ruby 一起安装的库(一堆 Ruby 代码)。该库允许您安装 gem (

gem install something
),还允许您从程序中加载这些 gem (
require 'some_gem'
)。所以总而言之,它是一堆代码,允许您使用 gem 以及 gem 生态系统附带的所有内容(安装、管理、使用)。

实际上,您可以在这里找到 RubyGems 代码:
https://github.com/rubygems/rubygems

您可以阅读该存储库的描述。

什么是

gem
bundle
命令,它们与 RubyGems 和 Bundler 有何关系?

gem
只是允许您作为人类与 RubyGems 库代码交互的命令,我刚刚在上面引用过。

事情并不比这更复杂也更不那么复杂。当您运行

gem
命令时,它将从 Ruby 安装加载 RubyGems 库代码(我刚刚向您展示了在 GitHub 上哪里可以找到代码)。然后
gem
命令调用此库中的相应方法,以满足您的请求(删除 gem、安装 gem、查询有关 gem 的信息等)。

Bundler 和

bundle
命令没有什么不同。 Bundler 也是一个代码库,并且
bundle
是与此代码交互的命令,但与 RubyGems 允许您在系统范围内安装和管理 gem 不同,Bundler 允许您在一个平台上管理和安装 gem。项目基础。因此,可以将 Bundler 视为一种项目隔离的 gem 管理器。这与 RubyGems 不同,RubyGems 是一个系统范围的 gem 管理器。

© www.soinside.com 2019 - 2024. All rights reserved.