bundlerの使い方/Railsプロジェクトの新規作成手順に沿って
はじめに
今回は「bundlerについて調べた」の続きとして、「bundler」の使い方を書いていきたいと思います。
尚、「bundler」と「rbenv」については以下の運用を前提としております(前回の記事を参照)
「rbenv」のRuby配下のgemには「bundler」だけを配置する
その他のgemは「bundle install --path vendor/bundle」コマンドによりプロジェクト毎に配置する
bundlerのインストール
まずはbundlerのインストールします。bundlerもgemの一種ですので、以下のコマンドで簡単にインストールできます。
$ gem install bundler $ rbenv rehash $ bundler -v
「gem install gem名」でrbenv配下に当該gemをインストールします。私はrbenv配下に配置するgemはこのbundlerのみにしています。
<補足>
「benv rehash」はrbenvを利用している場合のみ必要です。新規にインストールした「bundler」の実行ファイルへのリンクを、rbenv内のRubyの実行フォルダに貼り直し、実行できる様にしています。
「bundler -v」はインストールされているbundlerのバージョンを表示するコマンドです。バージョン番号が表示されれば無事がインストール完了したということです。
bundlerの使い方
前回書いた通り、「bundler」を利用する利点は、「gem同士の依存関係の自動検知」と「必要なgemの一括インストール」です。
手順
「Gemfile」というファイルに、インストールしたいgemの一覧を作成する。
ターミナルでインストールのコマンドを実行するだけ。
すると「bundler」が依存関係にあるgemやバージョンを自動で検知し、一括でインストールしてくれます。
という流れでGemの一括インストールを行います。
具体的な使い方
まずは、以下のコマンドを実行して「Gemfile」を作成します。
$ mkdr testapp $ cd testapp $ pwd $ bundle init
<補足>
mkdrコマンドで「testapp」ディレクトリを新規作成し、 cdコマンドでディレクトリ内に移動しています。pwdで移動できたかを確認しています。
上記の
「bundle init」
コマンドを実行するとカレントディレクトリ(ここではtestappディレクトリ)内に「Gemfile」という雛形ファイルが作成されます。
作成されたGemfileにインストールしたいgemの一覧を作成します。
bundle init
で作成されたファイル内には、以下のように書かれています。
# frozen_string_literal: true source "https://rubygems.org" # gem "rails"
source "https://rubygems.org"
で、Rubyのgemを管理するWebサービス「RubyGems」をインストール元として指定しています。
# gem "rails"
のコメントアウトを外します。
# frozen_string_literal: true source "https://rubygems.org" gem "rails" ←ここの#を削除します。
このように編集すればオッケーです。
これで、このGemfileに基づいてGem「Ruby on rails」をインストールする準備ができましたので、以下のコマンドを実行します。
$ bundle install --path vendor/bundle
<補足>
--path vendor/bundle
はオプションです。これを指定することで、ディレクトリ内にvendor/bundle
ディレクトリを自動生成し、その中にgemをインストールします。また、インストールと同時に、インストール済みのGemのバージョンを固定するための「Gemfile.lock」と、インストール先を指定する「.bundle/config」が自動生成されます。
詳細は前回記事をご参照下さい。
上記のコマンドを実行すると、ターミナルに以下の様な表示がされると思います。
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 ・・(省略)・・インストールされたGemとバージョン 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.
Gemfileには「gem rails」のみの記述しかありませんが、実際には(今回の例では)38種類ものGemがインストールされているのが分かると思います。
これは「rails」をインストールする時に、bundlerが依存関係にあるGemを自動検知し一括インストールしてくれているからです。
これらを自分で調べて一つ一つをインストールする手間を考えると、bundlerがいかに便利かお分りいただけると思います。
さて、ここまでの手順で「testapp」ディレクトリ内に、「.bundle/config」「vendor/bundle」「Gemfile」「Gemfile.lock」ファイルが作成されました。
ただしこの時点では、これから開発するウェブアプリに組み込むためのGemfileではなく、ウェブアプリの骨組みを構築するためのGem「Rails」を用意したにすぎません。
<補足>
この手順を行った理由は、Railsを含めた全てのGemをシステム環境にインストールしない様にし、システム環境をクリーンに保つためです。
bundler以外のGemは全てローカル環境下にのみインストールする前提で書いています。
ここから、あらためて新規Railsプロジェクトを作成していきます。
$ bundle exec rails new . -B -d mysql $ bundle exec rails s
今回のプロジェクトの新規作成の際に利用しているオプションは以下の通りです。
オプション(省略版) | オプション | 説明 |
---|---|---|
-d | --database=DATABASE | 指定したデータベースに変更する(railsのデフォルトはsqlite) |
ーB | --skip-bundle | Railsプロジェクト作成時にbundle installを行わないようにする |
尚、Railsのインストール実行時にGemfileを上書きしていいか聞かれますので「yes」にして続行します。
<補足>
Railsチュートリアル等では
rails new test-app
のようにプロジェクト名を指定していますが、ここを.(ドット)
にすることで、現在のディレクトリ(今回はtestapp)にRailsプロジェクトが生成されます。また新規作成時に自動で
bundle install
が行われますので、余計なインストールを避けるためオプション-B
でbundle install
を指定しています。最後に
bundle exec rails s
でローカルのrailsサーバーを立ち上げています。うまく立ち上がればオッケーです。
これにより、Railsプロジェクトが新規作成されましたので、あとはGemfileを編集します。
以下の例のように記述していきます。
# frozen_string_literal: true source "https://rubygems.org" gem 'rails', '5.1.6' gem 'mysql2', '0.3.18' gem 'puma', '~> 3.7' gem 'sass-rails', '~> 5.0' gem 'uglifier', '>= 1.3.0' group :development, :test do gem 'byebug' gem 'capybara', '~> 2.13' end group :production do gem 'unicorn' end
Gemfileへの記述が完了すると、プロジェクト内のファイルにGemをインストールしていきます。
今回は「bundle install」ではなく「bundle update」を実行します。
$ bundle update --path vendor/bundle
これで、新規プロジェクトで利用するためのGemが一括インストールできました。
「bundle install」と「bundle upgrade」について
先ほど実行した「bundle grade」と「bundle install」の違いは以下の通りです。
「bundle install」・・追加されたgemをインストールし「Gemfile.lock」に追加する。
「bundle update」・・「Gemfile」に基づいてgemを再インストールし、「Gemfile.lock」を更新する。
よく似ていて分りづらいですが、詳細は以下のようになります。
「bundle install」を実行すると・・・
「gemfile.lock」に基づいてgemがインストールされます(既存のgemは固定されており変更はされません)。
「gemfile」に新たに追加されたgemがある場合は、それを追加でインストールします。
新たなgemをインストールする際には、既存の「gemfile.lock」をベースにして依存関係を検知します。
追加されたgemの結果は「gemfile.lock」に追加されます。
「bundle update」を実行すると・・・
「gemfile」に基づいてgemがインストールされます。
新たに追加されたgemも、既存のgemも含めて、改めて全ての依存関係を検知し、再インストールされます。
その結果が「gemfile.lock」に上書き、更新されます。
上記理由から、開発中に新たにgemを追加する時は「bundle install」を実行するのが望ましいと思います。
(今回は参考として、また開発の初期段階なので「update」で実行しました。)
なぜなら、「update」により全てのgemのバージョンが入れ替わると、それまで開発を進めてきたアプリの挙動が変わってしまう恐れがあります。
「bundle update」は、エラーなどにより、既存のgemと新たに導入するgemとの依存関係を見直さなければらない様な場面でのみ実行しましょう。
また「bundle update」は上記理由から、本番環境で実行しない方がいいです。必ず、ローカル環境で実行しましょう。
よく使うコマンドのまとめ
ここまでで利用したbundlerのコマンドを下に整理しました。
コマンド | 説明 |
---|---|
bundle init | gemfileを作成する |
bundle install | gemをインストールする |
bundle update | Gemfile.lockを更新する |
bundle exec | bundlerでインストールしたgemを使いコマンド実行する |
bundle list | インストール済みのgem一覧を表示する |
特に「bundle install」「bundle exec」は実行頻度が高いので覚えておきましょう。
gemfileの書き方について
先に書いた通り「Gemfile」には、インストールしたいgemを以下の様に一覧で記入します。
# frozen_string_literal: true source "https://rubygems.org" gem 'rails', '5.1.6' gem 'mysql2', '0.3.18' gem 'puma', '~> 3.7' gem 'sass-rails', '~> 5.0' gem 'uglifier', '>= 1.3.0' group :development, :test do gem 'byebug' gem 'capybara', '~> 2.13' end group :production do gem 'unicorn' end
この例の様に、gem名の右隣に記号や数字が書かれています。これは以下の様な意味があります。
#バージョン指定 gem 'rails' #バージョンの指定なし gem 'rails', '5.2.2' # 5.2.2 固定 #指定のバージョン以上/未満などを指定 gem 'rails', '>= 5.2.0' # 5.2.0 以上の最新 gem 'rails', '>= 5.2.0', "< 5.2.2" # 5.2 以上、5.2.2 未満 #末尾の数値のみ最新にする gem 'rails', '~> 5.2.2' # 5.2.2 以上、5.3.0 未満の最新 gem 'rails', '~> 5.2' # 5.2 以上、6.0 未満の最新
また、group :production do 〜 end
などのブロックで囲ってある箇所があります。
これは、本番環境・テスト環境・開発環境によって利用するgemを分けたい(例えば「Rspecはテスト環境のみで使いたい」など)場合に、どの環境でどのgemをインストールするかを区別するための記述です。
参考ページ
最後に
今回は、Railsプロジェクトを新規作成する手順を追いながら「bundler」の使い方をご説明しました。
プロジェクト作成中にも、新たなgemの導入が必要になり何度もbundlerにお世話になると思いますので、ぜひ基本だけでも押えておきましょう。
関連ページ
後ほど追記します。