とある学生web開発者のブログ

知ったこと、感じたことを書きます

すごくしっくりくるRails環境構築の丁寧な説明

こんにちは!
最近すごくしっくりきているRailsの環境構築法を丁寧に説明します!
僕のmacちゃんは購入から1年以上経ちますが、railsがinstallされていません!🙅

まずはじめに

Railsの環境構築方法はたくさんあります。
ローカルに構築する、VagrantやDockerを利用する、cloud9などSass上に構築するなどなど。
挙げればキリがないですが、さくっと環境を立てられれば気持ちよく新しいプロジェクトをはじめられるもの。ぜひ自分なりの しっくり環境構築法 を持っておくべきです。

この記事では『ローカルに構築』する方法を書いていきます。

え?そうです。最近の流行りといえばDockerですよね?(ですよね?)
ですが僕のような貧弱MacちゃんだとDocker(やVagrant)のデメリットがメリットを上回るシーンがあります。
問題は、

  • メモリ
  • 容量

この2つです😱僕はVagrantが好きで2年近く愛用していたのですが、 容量とメモリを食い過ぎ!!
というわけでローカルで粛々と開発する今に至ったわけです。

手順

前提

Rubyはrbenvで管理しましょう。
プロジェクト間でRubyのバージョンが変わることなんて多々あります。
rbenvで管理すれば、プロジェクトごとにrubyのバージョンを切り替えて使うことができます。

また、bundlerは当然必要です。
$ rbenv exec gem install bundler でinstallしておきましょう。

bundle init

まだ$ rails new hoge_projectしません

$ mkdir rails_project
$ cd rails_project
$ bundle init
  => Writing new Gemfile to /projects/rails_project/Gemfile

これでGemfileだけが生成されます。
中身は、

# frozen_string_literal: true

source "https://rubygems.org"

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

# gem "rails"

となっています。この最後のrailsコメントアウトされているので、アンコメントします。

bundle install

そして、ようやくbundle installします。

$ mkdir vendor
$ mkdir vendor/bundle
$ bundle install  --path ./vendor/bundle --jobs=4

ポイントは、--path ./vendor/bundleです。これによってGemfileに書かれているgemは、今プロジェクト直下に作った./vendor/bundleの中にinstallされます。

なぜvendor/bundleの中に?

大事なところですので、ちゃんと説明します!
目的はgemたちのクリーンな管理です。
クリーンな状態とは

  • 必要なgemだけ
  • 他のプロジェクトに干渉されない
  • 独立したバージョン管理

が可能な状態です。

railsもgemのひとつです。普通にbundle installするとsystem(Mac全体に影響するgemの入れ場所)にinstallされてしまいます。
この状態になると、

  • あるプロジェクトではrails 5.2
  • 別のプロジェクトではrails 6.0

となった時に競合してしまいます。これがrailsだけならまだしもあらゆるgemで起きる光景など見たくありません・・。
それを防ぐために、プロジェクト直下のvendor/bundleにgemをまとめておくのです。

ちなみに一度 bundle install --path ./vendor/bundleとやると、.bundle/configファイルにpath指定が保存されるため、それ以降はbundle installだけでokです!

rails new

さて、これでrailsがinstallされたので、rails newが可能になります。

$ bundle exec rails new -B -d mysql -T -f .
bundle exec

これは、vendor/bundleに入れたgemを使うよーという意味です。
これを付けないと、system(Mac全体)のgemを使うようになってしまい、pathを指定した意味がなくなってしまいます。以降のrailsコマンドは全てbundle execを付けましょう。

-B

bundle installはまだ実行しないでね!という意味です。

-d mysql

データベースはmysqlを使うよ!という意味です。お好みで。

-T

テスト関連のファイルはいらないよ!という意味です。
rails標準はminitestですが、rspecの方が好きなので付けています。

-f

同名ファイルがすでにあっても無理やり上書きしてね!という意味です。
すでにあるファイルはGemfileですね。今はrailsしか書かれていませんが、このrails newコマンドでGemfileにたくさん追記されます。-fで強制的に上書きしてもらいます。

「.」

今この場所でrailsプロジェクトを作るね!という意味です。

さて、これでGemfileを確認するといつものRails初期Gemfileになっているはずです!

もう一度bundle install

混乱しないように!最初のbundle installではrailsをinstallしただけです。 ↓これでようやくsass-railsやpumaなどのgemをinstallできます。

$ bundle install

.gitignore

vendor/bundleに入っている大量のgemはgit管理しない方が良いでしょう。
.gitignoreに/vendor/bundleを追記します。

rails sができるまで

dbを作って、rails serverを起動します。

$ bundle exec rails db:create
$ bundle exec rails db:migrate
$ bundle exec rails server

さぁ!可愛い初期画面は見れたでしょうか?
mysqlのinstallなどは割愛しましたが、そちらも起動していれば初期画面が見れるはず!

f:id:kentear:20180917222633p:plain

最後に

調べてみたら、結構似たような内容の記事がありました😅
仮想環境もいいですが、ローカルにはローカルの良さもありますね!(主に軽さ)

昔プログラミングをはじめたばかりの頃は、何をどこにinstallしているのかわからず、バージョン違いに苦しみました。
今回の方法個人的にはシンプルで気に入っています。
DHHさんとかどうやってるんだろう。

他人に配布する時が弱いのがデメリットですね😭あとからDocker化もできるので、とりあえず個人プロジェクトは軽さ重視のこの方法がオススメです!