【Ruby】gem / bundle, それぞれのコマンドの違い

最初に

gemコマンド、bundleコマンドの違いを説明できるように覚書き。
いつも何となく使っていたが、本質的な違いは、グローバルなのか、ローカルなのかだと思う。

Bundler

gemの名前がBundlerないしbundler(名詞)で、コマンド名がbundle(動詞)。
意味合い的に、品詞を使い分けている模様。

2.5.9までは完全に外部のgemだったが、2.6.0からはDefault GemとしてRuby本体に取り込まれたらしい。
昔はgem install bundlerでbundlerを取り込まなければならなかったが、今はRubyをインストールすればついてくるので楽。

GitHubではrubygems/rubygemsで管理されている模様。
あと、昔はRubyコア外で管理されていたせいか、Bundler専用のドキュメントページbundler.ioがある。

プロジェクトでの管理以外に、gemを作るときの雛形を作るコマンドも提供している。

gemコマンドとbundleコマンドの違い

  • gemコマンドでは、Rubyのバージョン毎にgemが結びつくので、プロジェクトごとに管理できない。
  • Bundlerは、RubyのプロジェクトにGemfileを置いて、プロジェクトごとにgemを管理できる。
    Gemfile&Gemfile.lockを共有することで、プロジェクト参加者が使うgemのバージョンを共有できる。

色々違いがあるとは思うのですが、プロジェクトで使いたいものか、プロジェクトに限らずどこでも使いたいかになると思う。 プロジェクトで使う = 特定ディレクトリ配下に適用 = ローカルで使う。

npmコマンドとの関係性

npmのグローバルインストールがgemコマンドで、npmのローカルインストールがbundleコマンドに相当している、といえる。

npmのpackage.json, package-lock.jsonが、BundlerのGemfile, Gemfile.lockである。

参考