我有一个古老的 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 没有安装。gem
(RubyGems),如果是,它如何知道要安装哪个版本?bundle
1.17.3,但上次 Gemfile.lock 已经有“BUNDLED WITH 1.17.3”信息时,我是如何成功部署的,为什么会中断安装现在?最后,更多的是因为我总是感到困惑:
什么是 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 管理器。