開発日記5:Ruby on Rails環境構築

Ruby On Railsの開発環境構築をしているのだが、現在進行形でハマっているので忘れないようにメモ。

何にはまってる?
⇒ サーバが起動できない。
rails newでRailsアプリケーションを作成してるのに、
rails sでサーバが起動できない。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14218069694

何が原因?
⇒ 恐らくrails newで作成されたRailsアプリケーション配下にbinディレクトリ(ここにrailsコマンドを使えるようにする設定ファイルが入っているんだと思われる)が出来ないこと。

どうしたらいいの?
⇒分かりません。
出来ないときは下記のコマンドを使ってみたらいいよと言うことで、
理解後回しでとにかく実行してみた。
rake rails:update:bin
rake app:update:bin
結果、ロードが出来ないと怒られる。現状解決策見つからず。

どうするの?
⇒ 分からなくなったときはスタートに立ち返ろうということで、
今まで出てきたところで分からなかった用語や仕組みについて整理してみる。
① gem
RubyGemsが公開しているパッケージ(ライブラリ)。
パッケージ化されているので、これを使えばRubyの実装が簡単にできるらしい。

② Gemfile
gemはどうやら何かしらの依存関係を持っているらしく
それをGemfileにまとめておこう、という感じっぽい。
例えばGemfileに下記のような記述があるが
ruby ‘2.5.1’
# Bundle edge Rails instead: gem ‘rails’, github: ‘rails/rails’
gem ‘rails’, ‘~> 5.2.4’, ‘>= 5.2.4.1’
恐らく、ruby 2.5.1を使いますよ、そしてrailsのバージョンは
5.2.4以上5.2.4.1以下を使いますよ、って意味
そういったrubyにかかわるところで
バージョンの管理とかをしてくれているイメージかな。多分。

③ bundler
gem同士の依存関係やgemのバージョンを管理するgem。
・・・・分かりにくいが、
スポーツ(gem)にビリヤード(bundler)があるように
bundler(ビリヤード)もスポーツ(gem)なんだと、そういったニュアンスで合ってると思う。
どっちかというとgemのが意味的な範囲は広いイメージ。
具体的にbundlerが何をしてくれるのかという話だと、
例えばbundle installをすると、Gemfileに記述された内容をもとにgemをインストールしてくれる。
(合ってるかわからないけど)個人的にはgemを実際に管理してるのがGemfile、それをコマンドで扱っているのがbundlerというイメージ。

④ Gemfile.lock
実際にインストールしたgemがかいてるやつ(Gemfileはインストールされたgemはもちろん、インストールされていないものも含め書いている)。

⑤ gem追加の流れ
Gemfileを更新し、更新したGemfileでgemを取り扱いたいのでbundle installする。
そしたらインストールされたものがGemfile.lockに書き込まれる。

⑥ Gemfile.lockの存在意義
下記の違いがあるため、
Gemfile:バージョンに幅を持たせて記述ができる
Gemfile.lock:特定のバージョンのみ記述
A環境と全く同じB環境を作りたい場合に、Gemfile.lockが必要になってくる。
例)チームメンバと同じ環境で開発したい、テスト環境と本番環境で同一環境を用意したい場合など。
また、それならGemfile.lockだけでいいのではないかと思うが、
Gemfileがあることで、
開発中にバージョンアップされたときに対応ができ(Gemfileで幅を持たせて記述しているため)、開発者がGemfileに個別にバージョンを指定する手間が省け、開発効率が良くなる。
※下記を参考にさせていただきました。

⑦ bundle init
Gemfileを作成する。

⑧ bundle install/update
bundle install : Gemfile.lockをもとに、Gemをインストール。
bundle update: Gemfileをもとに、Gemをインストール。そしてGemfile.lockを更新。

⑨ bundle updateで気を付けること
Gemfile.lockがバージョン管理システムのリポジトリに登録されていないときに
bundle updateをすると大きな手戻りが発生するリスクがあることについて、
ネットで見ると色々書いてあったが、恐らく理解出来たと思うのでまとめ。

シチュエーション:A環境でbundle installし、A環境と全く同じ環境をB環境に作り、リポジトリにGemfile.lockなし。
⇒まず前提として、上記④で記載した通り、GemfileとGemfile.lockには下記の違いがあり
Gemfile:バージョンに幅を持たせて記述ができる
Gemfile.lock:特定のバージョンのみ記述
特定のバージョンが記載されている「Gemfile.lock」でA環境を作成したので、
それをそのままB環境に持っていった場合、その時点では同じ環境であるが、
それからGemfileに記載のバージョンがあがってB環境でbundle updateすると、
bundle updateではbundle installと違いGemfile.lockのバージョンも更新されるので、
もともとのバージョンがなんであったか分からなくなり、もともとの状態に戻せなくなる。
もちろん、リポジトリにGemfile.lockがあったり、B環境を作ったときのGemfile.lockのバックアップがあれば大丈夫。

今日はここまで
今年中にはrails sでサーバ起動できない問題解決できますように…

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA