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」が自動的に実行されていました。

p2-1

p2-2

この「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

p2-3

p2-4

必要なファイルの作成までが行なわれており「bundle install」は実行されていません。

では作成されたディレクトリのルートを見て下さい。次のように「Gemfile」というファイルが作成されています。

p2-5

「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

p2-6

p2-7

これで必要なGemパッケージがインストールされました。

また「Gemfile.lock」というファイルが新たに作成されています。

p2-8

先に記載したように「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 )

関連記事 (一部広告含む)