こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。
今日は、Rubyのbundlerについて解説します。
この記事では、
- bundlerとは
- bundlerのインストールとversion確認
- bundlerの基本的な使い方
という基本的な内容から、
- gemの依存関係とGemfile
- Gemfileへのgemのバージョンの書き方
- installとupdate時のgemfile.lock
などの応用的な使い方に関しても学習していきます。
このページで、Rubyのbundlerの使い方をよく把握して自分のスキルとしていきましょう!
bundlerとは
bundlerとは一言で言ってしまえば、「gemの依存関係とバージョンを管理するためのツール」です。
例えばAというgemがあって、Aを使うにはBというgemを使う必要がある、そのgemを使うにはCというgemを….
となっている時、AはBに依存しており、BはCに依存しているということになります。
そうなった時、一つ一つのgemをインストールするのって面倒ですよね?
しかし、bundlerを使えば、依存関係のあるgemを一括でインストールしてくれます!
一括でインストールしたgemはすべて、依存関係が解決された状態で、インストールされています。
一括でインストールされたgemは保存先を指定することができます。
$ bundle install --path vendor/bundle
上記のようにbundlerを実行すると、gemが現在のフォルダの配下のvendor/bundleにインストールされるようになります。
このようにプロジェクト別にgemをインストールすると、プロジェクトごとのgemのバージョンの違いを気にすることがなくなり便利です。
bundlerのインストールとversion確認
bundlerはgem install bundlerのコマンドでインストールすることができます。
$ gem install bundler
実行後、以下のような表示が出れば完了です。
Fetching: bundler-1.14.6.gem (100%) Successfully installed bundler-1.14.6 Parsing documentation for bundler-1.14.6 Installing ri documentation for bundler-1.14.6 Done installing documentation for bundler after 10 seconds 1 gem installed
インストールしたあとは、rbenvを使っている場合、以下のコマンドを実行します。
$ rbenv rehash
rehashが何をやっているかというと、新規にインストールされたbundlerの実行ファイルへの実行フォルダをrubyが気にすることのないようにしています。
ざっくりと説明すると、rubyの実行フォルダに、bundl;erの実行ファイルのシンボリックリンク(実行ファイルへのリンク)を貼り直し(rehash)しています。
bundlerをインストールが成功しているか確かめるためにバージョンを調べましょう。
bunlderのバージョンは以下のコマンドで、確かめることができます。
$ bundle -v Bundler version 1.14.6
bundlerの基本的な使い方
次にbundlerの使いかたを説明していきます。
bundlerでよく使うコマンドは三つあります。
bundle init
まずはbundle initです。
これは、gemをインストールするため各種インストールしたいgemを列挙したGememfileを作成するためのコマンドです。
$ bundle init Writing new Gemfile to /Users/shun/RubySample/Gemfile
これで以下のようなGemfileが作成されます。
# frozen_string_literal: true source "https://rubygems.org" # gem "rails"
bundle install
作成されたGemfileをもとにgemをインストールするコマンドがbundle installです。
試しにbundle initで作成したGemfileのrailsのコメントを外して、bundle installをしてみましょう。
$ bundle install
このようなコードがでれば完了です。
Fetching gem metadata from https://rubygems.org/………. Fetching version metadata from https://rubygems.org/.. Fetching dependency metadata from https://rubygems.org/. Resolving dependencies… Using rake 12.0.0 Using concurrent-ruby 1.0.5 Using i18n 0.8.1 Using minitest 5.10.1 …省略 Using actionmailer 5.0.2 Using railties 5.0.2 Using sprockets-rails 3.2.0 Using rails 5.0.2 Bundle complete! 1 Gemfile dependency, 38 gems now installed. Use bundle show [gemname] to see where a bundled gem is installed.
このようにrailsと依存関係のあるgemが全てインストールされていることがわかります。
また、installのオプションに、「–path vendor/bundle」をつけると、gemを現在のフォルダの下のvendor/bundleにインストールしてくれます。
$ bundle install --path vendor/bundle
プロジェクトごとに違うgemを入れる場合や、プロジェクトごとに違うバージョンのgemを入れる場合に使用します。
bundle installについて詳しくは、以下の記事を参照してください。
bundle update
bundle installと似ているコマンドにbundle updateというコマンドがあります。
インストールと同時に、gemに新しいバージョンがあれば更新するコマンドです。
bunlde updateを行うとエラーが解決するということもあるので、覚えておきましょう。
$ bundler update The Gemfile specifies no dependencies Resolving dependencies... Bundle updated!
以上のような実行結果になれば、updateは完了です。
bundle installとbundle updateについて詳しくは、以下の記事を参照してください。
bundlerの応用的な使い方
gemの依存関係とGemfile
Gemfileには、インストールしたいgemを列挙します。
bundlerはGemfileに列挙されたすべてのgemのバージョンを調べ、gem同士のバージョンによる依存関係を解決します。
最終的にはrubyにすべてのgemを読み込んでも間違いがないような各種gemのバージョンをインストールします。
このように、
- Gmfileには欲しいgemを書くこと
- gemのインストールには「bundler install」を使用すること
のようにすると、煩わしいgemのバージョン間の依存関係に配慮しながらgemコマンドでgemをインストールする必要がなくなります。
bundlerとGemfileは、rubyの開発上で必須のツールと言えるでしょう。
Gemfileへのgemのバージョンの書き方
先にも述べたとおり、Gemfileには、インストールしたいgemを列挙します。
たとえば、railsのgemを入れたい場合は、以下のように書きます。
gem "rails7"
railsのバージョンを指定した場合は、以下のように書きます。
gem 'rails7’, '3.2.1'
依存関係上バージョンがあがるのは仕方がないが、最低限このバージョンのgemが欲しいという場合は、以下のように書きます。
gem 'rails7’, '>=3.2.1'
バージョンがあがるのは仕方がないが、メジャーバージョンアップだけはして欲しくない場合は、以下のように書きます。
gem 'rails7’, '~>3.2.1'
上の例ではメジャーバージョンは「3」です。
通常、メジャーバージョンが上がると、大幅に使い方が変わったりしますので、このようにメジャーバージョンアップはしないような書き方があります。
なお、メジャーバージョンでない、下の方のバージョンはマイナーバージョンと言います。
通常、マイナーバージョンアップはバグ修正のためのバージョンアップで、使い方は大きく変わらないです。
そのため、マイナーバージョンアップは許可するようにしても良いでしょう。
installとupdate時のgemfile.lock
Gemfileにgemを列挙し、「bundler install」でgemをインストールすると、「gemfile.lock」というファイルができます。
この「gemfile.lock」は何かというと、インストールしたgemのバージョンを記載して保存しておくものです。
一度「gemfile.lock」ができると、使用するgemのバージョンが変わったりしません。
まさにgemのバージョンをロック(lock)して固定しているわけです。
この「gemfile.lock」があるかげで、開発時のgemとrubyのファイルと、本番環境でのgemとrubyの間が、gemのバージョンの違いにより動かなくなる、ということがなくなります。
自分たちの開発中でも、gemの開発者はgemのバージョンをどんどん上げていきます。
しかし、自分たちの開発環境のgemは「gemfile.lock」でロックされていて、gemのせいで急にrubyのプログラムが動かなくなる、ということにはなりません。
このように、gemのバージョンを固定して開発中に問題がおきないようにしているのが「gemfile.lock」ファイルです。
なお、「bundler update」をすると、gemがバージョンアップされますので、「gemfile.lock」も更新されます。
その場合は、新しいバージョンで固定されます。
まとめ
今回は、Rubyの bundlerについて学習しました!
学習のポイントを振り返ってみましょう!
- bundlerとはたくさんのgemのバージョン間の依存関係を解決しながらGemfileに列挙したすべてのgemをインストールしてくれるツール。
- 「bundle init」を実行するとGemfileのひな形ができる。
- 「bundle install」を実行するとGemfileに列挙したgemが依存関係を解決しながらインストールされる。
- 「bundle update」を実行すると、Gemfileに列挙したgemが更新される。
- Gemfileにはgemバージョンを指定したり、最低限のバージョンを指定したり、メジャーバージョンアップしないよう指定したりできる。
- 「gemfile.lock」は、開発時と本番環境運用時で、gemのバージョンの違いにより、rubyプログラムが動かなくなることがないよう、gemのバージョンを固定(lock)してくれるためのもの。
以上の内容を再確認し、ぜひ自分のプログラムに生かし学習を進めてください!