Ruby 在使用bundler时,在gempec中声明开发依赖项是否仍然有用?

Ruby 在使用bundler时,在gempec中声明开发依赖项是否仍然有用?,ruby,rubygems,bundler,Ruby,Rubygems,Bundler,我正在研究一种新的红宝石。我熟悉使用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移动到gempec # Dec

我正在研究一种新的红宝石。我熟悉使用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移动到gempec

# 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.

我为什么要这么做?为什么我的gempec应该关心我在开发中使用的gems?
development\u dependency
的作用是什么,Bundler还没有为我做什么?

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

为什么我要[将依赖项从Gemfile移动到.gempec]? Gemfile不仅允许您指定依赖项,还允许您指定。当您同时处理依赖项本身并且需要指向Git repo(或其他东西)时,这非常有用

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

为什么我的gempec应该关心我在开发中使用的gems? 从中为
添加开发依赖项

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


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

请注意,您引用的评论中没有说“开发依赖项”,而是说“开发中的依赖项”。开发中的依赖项通常包括直接从Git repo安装的gems的尖端版本。RubyGems无法从Git回购中安装gems;然而,Bundler可以。如果您正在安装从RubyGems无法处理的源(如VCS回购)安装的gems的尖端版本,则应将其列在
Gemfile
中,而不是
.gemPec
文件中。

您是对的。谢谢你澄清这一点。我仍然不确定是否首选在GemPec中声明开发依赖项,或者这种做法是否已被Bundler所取代。@Andrew:您仍然应该在GemPec中声明开发依赖项,以便可以通过RubyGems安装它们。我认为在安装gem时不会安装开发依赖项。这不是真的吗?@Andrew:默认情况下不是,但也可以选择。