ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

Bundlerを使ってgemをインストールする

RubyからPostgreSQLを操作するためのライブラリをインストールする。

目次


RubyGemsとは

Rubyには標準添付ライブラリ以外にも、インストールして使うライブラリがある。
それらインストールして使うライブラリをRubyではgem(ジェム)と呼ぶ。
gemを管理するシステムがRubyGems
RubyGemsRubyに標準添付されているシステムなのでRubyが使える状態ならすぐに使うことができる。
RubyGemsの操作はターミナル/PowerShellからgemコマンドを使って行う。
gemをインストールする書式は次のようになる。

ターミナル/PowerShell

gem install gem名


RubyGemsについてのWebページ


RubyGemsのWebサイト
https://rubygems.org/

RubyのWebサイトにもRubyGemsについて書かれている。

Ruby Webサイト
ライブラリ
https://www.ruby-lang.org/ja/libraries/

Bundlerとは

Bundlerはgem。
Bundlerはgemの依存関係を管理してくれるシステム(gem)。
gemの中には複数のgemが関連しあって動くものもある。Bundlerを使ってgemをインストールすると、そのgemと関連するgemも自動で束ごとインストールしてくれる。

BundlerのWebサイト
https://bundler.io/

Bundlerをインストールする

ターミナル/PowerShellからRubyGems(gemコマンド)でBundlerをインストールする。
手順は次のとおり。

RubyGemsをアップデートする。

gem update --system


試しにRubyGemsのバージョン確認してみる

gem -v


次のような返答がある。

2.7.6


Bundlerをインストールする。

gem install bundler


インストールしたらバージョンを確認してみる。

bundler -v


次のようにバージョンが返ってくればインストールは成功。

Bundler version 1.16.1


Bundlerを使ってgemをインストールする

Gemfileとは

BundlerはGemfileをもとにgemをインストールする。
GemfileについてはBundlerのWebサイトに詳しく載っている。

Bundler Docs
http://bundler.io/gemfile.html

Gemfileをつくる

Bundlerにはディレクトリ単位でgemを管理できるオプションがある。
今回はそのオプションを使ってgemをインストールする。

ターミナル/PowerShellのcdコマンドで管理したいディレクトリに移動する。
今回はruby_lessonというディレクトリにgemをインストールする。

ディレクトリに移動したらGemfileをつくる。
まずBundlerを最新にする。

gem update bundler


Gemfileをつくる。

bundle init


返答

Writing new Gemfile to /Users/username/ruby_lesson/Gemfile


上のように返答があればディレクトリ内にGemfileがつくられている。
初期に書かれている内容は次のとおり。
Gemfile初期状態

# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"


Bundle install

gemをインストールするにはGemfileにインストールしたいgemを記入する。
今回はPg、Active Record、dotenvという3つのgemをインストールする。
その場合、次のようにGemfileに追記する。

Gemfile
上の初期状態に追記

gem 'pg'
gem 'activerecord'
gem 'dotenv'


Gemfileに追記したら次のコマンドを入力。
今回はgemをシステムにインストールするのではなく、ディレクトリ内で管理する。
そのためにpathオプションをつける。

bundle install --path vendor/bundle


これで3つのgemがruby_lessonディレクトリ内にインストールされる。

--pathオプションつきのインストールでおきたこと。

  • --pathの引数のディレクトリがつくられる
  • .bundleディレクトリもつくられる
    • .bundleディレクトリの中にconfigファイルがつくられる
    • configファイルにpathオプションの引数のディレクトリが書き込まれる
    • configファイルの内容がBundlerに登録されるので、次回からbunle installする際はpathオプションつける必要はない(つけなくても自動で、システムにではなくvendorディレクトリ内にインストールされてしまう)

.bundler/configの内容
Macで不可視ファイルを表示するにはcommand + shift + .キーを同時に押す。

---
BUNDLE_PATH: "vendor/bundle"


Gemfile.lock

bundle installするとGemfile.lockというファイルがつくられる。
ここにはBundlerが実際にインストールしたgemの詳細が書かれる。
Bundlerはgemの依存関係を考慮して必要なgemを自動でインストールするので、Gemfileに書いていないgemもインストールされる。
Gemfile.lockをコーピーして別のディレクトリで使えば、書かれた内容と同じgem環境がつくれる。

今回つくられたGemfile.lockの内容は次のとおり。
3つのgemを使うのに関連するgemの多さに驚く。  
Gemfile.lock

GEM
remote: https://rubygems.org/

specs:
activemodel (5.2.0)
activesupport (= 5.2.0)
activerecord (5.2.0)
activemodel (= 5.2.0)
activesupport (= 5.2.0) arel (>= 9.0)
activesupport (5.2.0)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
arel (9.0.0)
concurrent-ruby (1.0.5)
dotenv (2.3.0)
i18n (1.0.1)
concurrent-ruby (~> 1.0)
minitest (5.11.3)
pg (1.0.0-x64-mingw32)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)

PLATFORMS
Ruby

DEPENDENCIES
activerecord
dotenv
pg

BUNDLED WITH
1.16.1


上記はmacOS10の場合。
Windows10の場合はPLATFORMSがx64-mingw32となる。

pathオプションつきbudle installしたgemの実行

pathオプションをつけてbudle installしたgemを実行する場合はコマンドの頭にbundle execコマンドをつける。
Rubyコードを実行する例は次のとおり。

bundle exec ruby ファイル名


Windows10 Ruby2.4.4でbundle install失敗

今回、Windows10のRuby2.4.4でbundle installがエラーになった。
concurrent-rubyのインストールがうまくいかないのが原因。
仕方ないのでRubyのバージョンを2.5.1に変えたらインストールが成功した。


次回はActive Recordを使ってRubyからPostgreSQLを操作します。


今回の動作確認環境
macOS 10.13.3
Ruby 2.4.4p296
ターミナル 2.8.2

Windows10 1709
Ruby 2.5.1p57 [x64-mingw32]
Windows PowerShell 5.1.16299.251