简体   繁体   中英

Is it still useful to declare development dependencies in a gemspec when using bundler?

I am working on a new Ruby Gem. I am familiar with using Bundler to manage gems:

source "https://rubygems.org"

gemspec

gem 'rspec-rails'

I am familiar with specifying dependencies in a gemspec file:

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

The Gemfile that was generated mentions that I should move my dependency declarations from my Gemfile to my gemspec when I'm ready to release.

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

Why would I want to do this? Why should my gemspec care what gems I'm using in development? What purpose does development_dependency serve that Bundler doesn't already do for me?

To best answer your questions, we should first untangle the concepts of Bundler and Rubygems. I think a great explanation can be found here .

Why Would I Want to [move dependencies from Gemfile to .gemspec]?

Gemfile allows you to specify not only dependencies, but where the dependencies come from . This is useful when you are also working on the dependencies themselves and need to point to a Git repo (or something).

Once work on these dependencies is complete, Rubygem conventions dictate that you move the dependency declaration on these released gems into your .gemspec file. Adding a line gemspec tells Bundler to read from this conventional Rubygems location. If you are working on a gem, and you are not actively developing the gem's dependencies, then all dependencies should be declared in your .gemspec

Why should my gemspec care what gems I'm using in development?

From the docs for add_development_dependency :

Development dependencies aren't installed by default and aren't activated when a gem is required.

A popular example for this Rspec. You should generally declare Rspec as a development dependency for yourself, but not force everyone else to download it when they grab your gem.

Note that the comment you cited does not say "development dependencies", it says "dependencies that are in development". Dependencies that are in development commonly include cutting-edge versions of gems that you are installing directly from a Git repo. RubyGems cannot install gems from a Git repo; however, Bundler can. If you are installing cutting-edge versions of gems installed from a source that RubyGems cannot handle (such as a VCS repo), you should list them in your Gemfile instead of the .gemspec file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM