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

时间:2014-10-03 18:13:42

标签: ruby rubygems bundler

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

source "https://rubygems.org"

gemspec

gem 'rspec-rails'

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

Gem::Specification.new do |s|
  # ...
  s.add_dependency "rails", "~> 4.1.5"
end

生成的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.

为什么我要这样做?为什么我的gemspec会关心我在开发中使用的宝石? development_dependency的目的是什么,Bundler还没有为我做过什么?

2 个答案:

答案 0 :(得分:2)

为了最好地回答您的问题,我们首先应该解开Bundler和Rubygems的概念。我认为一个很好的解释可以是found here

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

Gemfile不仅可以指定依赖项,还可以指定where the dependencies come from。当您还在处理依赖项本身并需要指向Git仓库(或其他东西)时,这非常有用。

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

中声明所有依赖项。

为什么我的gemspec会关心我在开发中使用的宝石?

来自add_development_dependency的{​​{1}}:

  

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

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

答案 1 :(得分:1)

请注意,您引用的评论并未说明"开发依赖关系",它表示"正在开发的依赖关系"。正在开发的依赖项通常包括您直接从Git仓库安装的宝石的尖端版本。 RubyGems无法从Git仓库安装gem;但是,Bundler可以。如果要安装从RubyGems无法处理的源(例如VCS存储库)安装的尖端版本的gem,则应在Gemfile而不是.gemspec文件中列出它们。