我正在开发一个新的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还没有为我做过什么?
答案 0 :(得分:2)
为了最好地回答您的问题,我们首先应该解开Bundler和Rubygems的概念。我认为一个很好的解释可以是found here。
Gemfile不仅可以指定依赖项,还可以指定where the dependencies come from。当您还在处理依赖项本身并需要指向Git仓库(或其他东西)时,这非常有用。
完成对这些依赖项的处理后,Rubygem约定规定您将这些已发布的gems上的依赖项声明移动到.gemspec文件中。添加一行gemspec
告诉Bundler从这个传统的Rubygems位置读取。如果您正在处理gem,并且您没有积极开发gem的依赖项,则应在.gemspec
来自add_development_dependency
的{{1}}:
默认情况下不会安装开发依赖项,并且在需要gem时不会激活。
这个Rspec的一个流行的例子。您通常应该将Rspec声明为自己的开发依赖项,但不要强迫其他人在获取您的gem时下载它。
答案 1 :(得分:1)
请注意,您引用的评论并未说明"开发依赖关系",它表示"正在开发的依赖关系"。正在开发的依赖项通常包括您直接从Git仓库安装的宝石的尖端版本。 RubyGems无法从Git仓库安装gem;但是,Bundler可以。如果要安装从RubyGems无法处理的源(例如VCS存储库)安装的尖端版本的gem,则应在Gemfile
而不是.gemspec
文件中列出它们。