ruby-on-rails - 从 Ruby on Rails 开始。在指定要下载的版本时,Gemfile 和 gems 是如何工作的?

标签 ruby-on-rails ruby rubygems gem version

我尝试阅读文档,但我仍然不清楚:

假设我的 Gemfile 中有以下语句:

source 'https://rubygems.org'

gem 'rails', '3.2.2'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'

gem 'json'

...

我正在尝试学习如何使用 Ruby on Rails 这个网站:http://ruby.railstutorial.org/它说我需要为这个版本的 rails (3.2.2) 安装 sqlite3 gem。

我的问题是:如果我在运行 bundle install 时没有为系统指定要下载的 sqlite3 gem 的确切版本,那么它会安装最新的吗与我正在使用的 rails 和 ruby​​ 版本一起工作的版本(假设它分别是 3.2.2 和 1.8.7 p-352)或者它会下载最新版本的 sqlite3 gem 是否可以与我一起工作有没有安装?

我不太确定 Gemfile 的这方面是如何工作的,文档也不清楚,或者我没有找到明确说明这一点或其他方面的地方。

最佳答案

因此,它将安装与您列出的其他 gem 指定的依赖项兼容的最新版本的 sqlite3。

比如说,rails 说它只适用于大于 1.0 但小于 4.0 的 sqlite3,它可能会安装 3.9.5。我正在编造所有这些数字,只是一个例子。

事实上,我不知道 rails 是否 指定了它需要的任何特定版本的 sqlite3。大概“json”也没有,因为它与数据库无关。如果您列出的其他 gem 均未指定对 sqlite3 的任何要求,它将只安装可用的最新版本。

“捆绑安装”正在使用 bundler ,关于它如何解决依赖关系的更多信息是 here .

所以 bundler 将下载满足您列出的所有其他 gem 要求的最新 gem。假设您列出了一个需要早于 2.0 的 sqlite3 的 gem A 和一个需要晚于 2.1 的 sqlite3 的 gem B——“bundle install”会提示并说它不能满足所有人。

这依赖于 gems 自己对它们所依赖的其他 gem 的每个要求的广告。有时它们可​​能是错误的或缺失的。可能是 rails 实际上没有指定它需要的 sqlite3 版本——因为它实际上根本需要 sqlite3(您不必将 sqlite 与 rails 一起使用),这可能很好。在这种情况下,bundler 只能获取最新版本的 sqlite3。这并不能保证该版本可以正常工作。但它只能做这么多。

您还提到了与特定版本的 ruby​​ 的兼容性问题,例如 1.8.7-p352。 Bundler 在那里的能力较差,您通常不能指望它知道哪个版本与特定版本的 ruby​​ 兼容(因为 gems 没有很好的方式以 bundler 可以使用的方式表达这一点,唉)。

但总的来说,,事情会解决的。如果您不知道或不关心您想要什么版本的 sqlite3(或任何其他 gem),但知道您想要一个 - 做您所做的,运行“bundle install”,看看它是否有效。它可能会。如果没有,请用谷歌搜索错误消息,您可能会找到有人解释为什么没有出现以及您需要做什么。

PS:如果这还不够。 sqlite3 有点奇怪,因为虽然 Rails 设计用于使用它,但它不是必需的。但是默认情况下,Rails 在使用最新版本的 rails rails new my_app 创建新应用程序时,会已经为您将 sqlite3 放入 Gemfile 中。它会像您一样进行操作,没有版本限制。这就是对它会正常工作充满信心的原因。请注意,在 rails 3.2.2 中,rails new my_app 会将一些其他内容放入您的 Gemfile 中,确实列出了更具体的版本,例如 gem 'sass-rails ', '~> 3.2.3',因为虽然 Rails 并非绝对需要这些东西(否则它们将被表达为要求,而不需要在您的应用程序的 Gemfile 中明确表示),rails 安装程序知道只有某些版本可以工作。

关于ruby-on-rails - 从 Ruby on Rails 开始。在指定要下载的版本时,Gemfile 和 gems 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9781203/

相关文章:

ruby-on-rails - 除了在 Ruby on Rails 中使用 namespace 的操作之外,如何重写 URL?

ruby - 为什么要从 gemspec 文件中排除测试?

ruby-on-rails - 安装 unf_ext 0.0.7.2 不起作用

ruby - 将方法名称作为参数传递给另一个方法

mysql - bundle 安装 ROR 时出现错误 'mysql.h is missing'

ruby-on-rails - 修改 URL 模式 Ruby Rails

ruby-on-rails - Turbolinks 不允许我在不重新加载页面的情况下提交表单

ruby-on-rails - 如何启用 `request` on Rails 模块

ruby-on-rails - Ruby on Rails - 引用同一模型两次?

php - 需要帮助来理解这个 PHP api 并使用 Ruby 访问它