Gem 開発における gemspec と Gemfile への開発 Gem の指定について

昨日の Asakusa.rb 第547回で、hsbt さんに聞いて amatsuda さんたちを交えて話していた表題について書き残しておく。先に記しておくと決定的な結論はない。

Gem を開発する際に、開発時のみに使う Gem を指定する先として gemspec を使った spec.add_development_dependency での指定と Gemfile を使った gem での指定がある。補足しておくとそれぞれ前者は RubyGem での指定で、後者は Bundler での指定となる。このあたりどちらが推奨されているとかあれば聞いてみようというのが質問の発端だった。

RubyGems 3.1.2 と Bundler 2.1.4 時点で、それぞれでできることは以下となる。

RubyGems

メタデータとして rubygems.org に公開できる。ただしそれを使ったアナリティクスなどをとっているわけではないみたい。

Gemfile

Gemfile に gem 指定する際にできることとして path オプションや github オプションに加え、group 指定などできる。加えて gemfiles に複数バージョンそれぞれ用の Gemfile を配置することで、例えば複数バージョンの Rails についてバージョンごとに Gemfile を切り替えたテストができる。Appraisals を使った複数の Gemfile 切り替えなんかもこれがベースになる。これらは gemspec ではできないこと。

github.com

結局のところ?

基本的にできることが多い Gemfile に書けば良いというスタイルもある一方で amatsuda さんのスタイルは面白くて、複数環境の Gemfile に共通するものは gemspec に指定して、環境差分がある分についてはそれぞれの Gemfile に指定することで開発依存 gem の指定を DRY にするというもの。好きな言葉を地で行っていて流石だと思った。

結論という結論は特になく、現状だと Gemfile でしか指定できないことは Gemfile をもちいて行うしかなく、あとは考え方次第のスタイルという感じではないだろうかと理解している。

ちなみに GitHubUsed by はそれぞれが参照されていそうという感じだった。