使用 bundler 时在 gemspec 中声明开发依赖项仍然有用吗?

And*_*rew 6 ruby rubygems bundler

我正在开发一个新的 Ruby Gem。我熟悉使用 Bundler 管理 gems:

source "https://rubygems.org"

gemspec

gem 'rspec-rails'
Run Code Online (Sandbox Code Playgroud)

我熟悉在 gemspec 文件中指定依赖项:

Gem::Specification.new do |s|
  # ...
  s.add_dependency "rails", "~> 4.1.5"
end
Run Code Online (Sandbox Code Playgroud)

生成的 Gemfile 提到当我准备发布时,我应该将我的依赖声明从我的 Gemfile 移动到我的 gemspec。

# Declare any dependencies that are still in development here instead of in
# your gemspec. These might include edge Rails or gems from your path or
# Git. Remember to move these dependencies to your gemspec before releasing
# your gem to rubygems.org.
Run Code Online (Sandbox Code Playgroud)

我为什么要这样做?为什么我的 gemspec 应该关心我在开发中使用的 gems?什么用途development_dependency投放捆扎机已经不适合我吗?

小智 5

为了最好地回答您的问题,我们应该首先理清 Bundler 和 Rubygems 的概念。我认为可以在这里找到一个很好的解释。

我为什么要[将依赖项从 Gemfile 移动到 .gemspec]?

Gemfile 不仅允许您指定依赖项,还允许您指定依赖项的来源。当您也在处理依赖项本身并且需要指向 Git 存储库(或其他东西)时,这很有用。

一旦完成对这些依赖项的处理,Rubygem 约定会要求您将这些已发布 gem 的依赖项声明移动到您的 .gemspec 文件中。添加一行gemspec告诉 Bundler 从这个传统的 Rubygems 位置读取。如果您正在开发 gem,并且您没有积极开发 gem 的依赖项,那么所有依赖项都应在您的 .gemspec 中声明

为什么我的 gemspec 应该关心我在开发中使用的 gems?

文档add_development_dependency

默认情况下不会安装开发依赖项,也不会在需要 gem 时激活。

此 Rspec 的一个流行示例。您通常应该将 Rspec 声明为您自己的开发依赖项,但不要强迫其他人在抢到您的 gem 时下载它。