Bundlerを使ったGemパッケージの管理
Rails3系からアプリケーションで必要となるGemパッケージの管理にBundlerを使うようになりました。ここではBundlerとはどういったもので、実際にどうやって使うのかについて解説します。
Gemパッケージとは
まずはGemパッケージの簡単な解説です。
Rubyで使われるライブラリやアプリケーションはGemと呼ばれる形式のパッケージにすることができます。多くのライブラリがGem形式でパッケージされ公開されており、これらはRubyGemsと呼ばれるパッケージ管理ツールを使ってダウンロードを行なったりインストールすることができます。これらのパッケージのことを単にGemとかGemパッケージなどと呼んだりします。
RailsもGem形式でパッケージになったもので、Railsをインストールした時も「gem install rails」とRubyGemsを使ってインストールを行いました。
Railsで作成したアプリケーションは通常Railsだけでなく他の多くのGemパッケージも使います。例えばSQLiteをRailsから利用するために必要な"sqlite3"パッケージもその一つです。
Bundlerとは
Railsのアプリケーション開発を複数のPCで行なおうとした場合を考えてみます。プログラムファイルはもちろんですが、全てのPCで対象のアプリケーションで使用しているGemパッケージをインストールしておかなければなりません。またGemパッケージのバージョンも揃える必要があります。
そこで使われるのがBundlerです。BundlerはRailsアプリケーションに必要となるGemパッケージの種類やバージョンを管理し、複数のPCで必要なGemパッケージをインストールする仕組みを提供してくれます。
Bundlerを使ったGemパッケージのインストール
それでは実際にBundlerを使い方を確認していきます。「rails new アプリケーション名」を使ってRailsアプリケーションを作成すると、必要なファイルを作成した後で「bundle install」が自動的に実行されていました。
この「bundle install」がBundlerを使って必要なGemパッケージをインストールしている部分となります。
このようにRailsアプリケーションを新規に作成した時、(1)必要なファイルの作成、(2)必要なGemパッケージが記載されたGemfileの作成、(3)Gemfileに基づいたGemパッケージのインストール、(4)他の環境で使用するためのGemfile.lockの作成、といったことが行われています。
では動作を確認するために「bundle install」を手動で行なってみます。Railsアプリケーションを作成する時、「--skip-bundle」を付けて実行すると「bundle install」を自動的に実行しません。今回テストとして次のようにアプリケーションを作成しました。
rails new bundletest --skip-bundle
必要なファイルの作成までが行なわれており「bundle install」は実行されていません。
では作成されたディレクトリのルートを見て下さい。次のように「Gemfile」というファイルが作成されています。
「Gemfile」をテキストエディタで開いてみます。
source 'https://rubygems.org' gem 'rails', '3.2.2' # Bundle edge Rails instead: # gem 'rails', :git => 'git://github.com/rails/rails.git' gem 'sqlite3' # Gems used only for assets and not required # in production environments by default. group :assets do gem 'sass-rails', '~> 3.2.3' gem 'coffee-rails', '~> 3.2.1' # See https://github.com/sstephenson/execjs#readme for more supported runtimes # gem 'therubyracer' gem 'uglifier', '>= 1.0.3' end gem 'jquery-rails' # To use ActiveModel has_secure_password # gem 'bcrypt-ruby', '~> 3.0.0' # To use Jbuilder templates for JSON # gem 'jbuilder' # Use unicorn as the app server # gem 'unicorn' # Deploy with Capistrano # gem 'capistrano' # To use debugger # gem 'ruby-debug19', :require => 'ruby-debug'
文頭に"#"があるものはコメントです。細かい記述の仕方はここでは省略させて頂きますが、例えば次のようなことが書かれています。
gem 'rails', '3.2.2' # バージョン3.2.2の Rails gem 'sqlite3' # 任意のバージョンの sqlite3 gem 'jquery-rails' # 任意のバージョンの jquery-rails
次に「bundle install」を行ないます。この時先程の自動で作成された Gemfile を元にGemパッケージがインストールされます。Gemfile ファイルに書かれたGemパッケージと、それらのGemパッケージが依存する(必要とする)他のGemパッケージも自動的にインストールされます。
まず対象のアプリケーションディレクトリに移動し、その後で「bundle install」と実行して下さい。
bundle install
これで必要なGemパッケージがインストールされました。
また「Gemfile.lock」というファイルが新たに作成されています。
先に記載したように「bundle install」を行なうと、「Gemfile」に書かれたGemパッケージと、そのGemパッケージが依存しているGemパッケージを自動的に調べて全てインストールしてくれます。「Gemfile.lock」はインストールされたGemパッケージの名前とバージョンが記録されたものです。
では「Gemfile.lock」をテキストエディタで開いてみます。
GEM remote: https://rubygems.org/ specs: actionmailer (3.2.2) actionpack (= 3.2.2) mail (~> 2.4.0) actionpack (3.2.2) activemodel (= 3.2.2) activesupport (= 3.2.2) builder (~> 3.0.0) erubis (~> 2.7.0) journey (~> 1.0.1) rack (~> 1.4.0) rack-cache (~> 1.1) rack-test (~> 0.6.1) sprockets (~> 2.1.2) activemodel (3.2.2) activesupport (= 3.2.2) builder (~> 3.0.0) activerecord (3.2.2) activemodel (= 3.2.2) activesupport (= 3.2.2) arel (~> 3.0.2) tzinfo (~> 0.3.29) activeresource (3.2.2) activemodel (= 3.2.2) activesupport (= 3.2.2) activesupport (3.2.2) i18n (~> 0.6) multi_json (~> 1.0) arel (3.0.2) builder (3.0.0) coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) coffee-script (2.2.0) coffee-script-source execjs coffee-script-source (1.2.0) erubis (2.7.0) execjs (1.3.0) multi_json (~> 1.0) hike (1.2.1) i18n (0.6.0) journey (1.0.3) jquery-rails (2.0.1) railties (>= 3.2.0, < 5.0) thor (~> 0.14) json (1.6.5) mail (2.4.3) i18n (>= 0.4.0) mime-types (~> 1.16) treetop (~> 1.4.8) mime-types (1.17.2) multi_json (1.1.0) polyglot (0.3.3) rack (1.4.1) rack-cache (1.2) rack (>= 0.4) rack-ssl (1.3.2) rack rack-test (0.6.1) rack (>= 1.0) rails (3.2.2) actionmailer (= 3.2.2) actionpack (= 3.2.2) activerecord (= 3.2.2) activeresource (= 3.2.2) activesupport (= 3.2.2) bundler (~> 1.0) railties (= 3.2.2) railties (3.2.2) actionpack (= 3.2.2) activesupport (= 3.2.2) rack-ssl (~> 1.3.2) rake (>= 0.8.7) rdoc (~> 3.4) thor (~> 0.14.6) rake (0.9.2.2) rdoc (3.12) json (~> 1.4) sass (3.1.15) sass-rails (3.2.4) railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) sprockets (2.1.2) hike (~> 1.2) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) sqlite3 (1.3.5-x86-mingw32) thor (0.14.6) tilt (1.3.3) treetop (1.4.10) polyglot polyglot (>= 0.3.1) tzinfo (0.3.32) uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) PLATFORMS x86-mingw32 DEPENDENCIES coffee-rails (~> 3.2.1) jquery-rails rails (= 3.2.2) sass-rails (~> 3.2.3) sqlite3 uglifier (>= 1.0.3)
重複している部分もありますが、これらがインストールされたGemパッケージとなります。
他の環境で同じアプリケーションの開発を行なう場合は、プログラムファイルに加えてこの「Gemfile.lock」ファイルを配布します。そして他の環境で「bundle install」を実行すると、今度は「Gemfile.lock」ファイルが参照され、指定されたバージョンのGemパッケージがインストールされます。
このようにBundlerを使うことで、必要なGemパッケージを管理し、同じ開発環境を簡単に構築することができます。
( Written by Tatsuo Ikura )

著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。