LoginSignup
7

More than 3 years have passed since last update.

gemspecのadd_development_dependencyではなく、Gemfileを使う?

Posted at

久しぶりに、bundle gem で gem を作ったら、rake や rspec が、gemname.gemspec ではなく、Gemfile に記載されるようになっていたので、調べてみました。

調べた結果、Gemfile のほうが柔軟性があり、実際のユースケースでも gemspec の add_development_dependency だけでは対応できないことがある、そのため Bundler では Gemfile の使用を奨励するために修正した、ということのようです。

なお、この記事は、「こういう理由でこうした方が良い」というものではないです。

経緯

久しぶりに bundle gem コマンドで gem を作りました。

bundle gem gemname --test=rspec

いつも通り、自動生成された gemname.gemspec を TODO 部分を置き換えるために開いたら、add_development_dependency がありませんでした。

$ grep -e "dependency" gemname.gemspec 
$ 

なのに、bundle install したら、rake 等がインストールされます。

$ bundle install
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
Fetching rake 12.3.3
Installing rake 12.3.3
...

Gemfile を見てみると、こちらに定義が移っていました。

$ cat Gemfile
source "https://rubygems.org"

# Specify your gem's dependencies in gemname.gemspec
gemspec

gem "rake", "~> 12.0"
gem "rspec", "~> 3.0"

個人ブログ等では、Gemfile ではなく gemspec に書くべきだ、とよく主張されているのに、なぜでしょうか?

調査結果

この修正が Bundler に入ったのは、この PR のようです。開発環境の構築は非常に複雑で、add_development_dependency の使用は奨励されない、とのことです。

これを契機に、Bundler と Rails が、開発環境の依存関係の定義に add_development_dependency を使用しないようになったようです(Bundler の PRRails の PR)。

開発環境の依存関係の定義が add_development_dependency から無くなって変化があるのは、簡単に調べた限り、次の2点のようでした。

  • RubyGems の gem のページで、Development依存性 の一覧が表示されなくなる
  • gem install --dev gemname コマンドでの、開発環境の依存関係のインストールができなくなる

個人的感想

RubyGems の gem のページから、開発環境の依存関係の一覧が表示されなくなるのは悲しいです。

一方、gem install --dev gemname コマンドで開発環境の依存関係がインストールできなくなるのは、問題にならないのではないかと思います。
なぜなら、Bundler を使わない gem install --dev gemname コマンドでの gem のインストールは、依存関係の gem をバージョン指定している場合、マシン1台、もしくは RVM や rbenv 環境ならユーザー1つを、それ専用に使う形になってしまう可能性があるからです。

各 PR も、それほど議論にならずに Merge されているので、add_development_dependency を使わないというのは、当たり前になりつつあるのでしょうか?

この記事を読まれた方は、ぜひコメントください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7