为什么 bundler 没有安装依赖项?

Why didn't bundler install the dependency?

我对 bundler 的理解是,当你在 Gem 文件中添加一个 Gem 时,当你 运行 bundle install 时,bundler 会自动安装它的所有依赖项。

我正在创建一个 gem。在我的 gem 规范中,我指定了以下要求:

spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "eventmachine", "~> 1.0.4"
spec.add_development_dependency "em-synchrony"
spec.add_development_dependency "rspec"

Bundler 顺利完成所有安装。当我查看 Gem.lock 时,我注意到以下内容:

...
em-synchrony (1.0.5)
  eventmachine (>= 1.0.0.beta.1)
...

注意 em 同步没有 MySQL 依赖性。当我启动 irb 并需要 gem 时,出现以下错误:

> require 'my_gem'
RuntimeError: Missing EM-Synchrony dependency: gem install mysql2

为什么捆绑器没有自动安装 mysql2 gem?

em-synchrony 不依赖于 mysql2。它只是一个受支持的客户端,其中之一:https://github.com/igrigorik/em-synchrony#em-synchrony

事实上,查看 em-synchrony 的 gemspec 只揭示了一个依赖项 eventmachinehttps://github.com/igrigorik/em-synchrony/blob/master/em-synchrony.gemspec

然而,它是一个 development dependency em 同步,正如其 Gemfile 中的开发组所列。不会为您安装这些依赖项。

您必须自己手动添加 mysql2