久しぶりに、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 の PR、Rails の 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
を使わないというのは、当たり前になりつつあるのでしょうか?
この記事を読まれた方は、ぜひコメントください。