電波ビーチ

☆(ゝω・)v

Rubyでの開発について最近学習したこと rbenv, gem, rubygems, bundler

最近っつっても一月くらい前に書いて以降ほったらかしにしてたやつです。長いので目次付きです。
自分用のメモ代わりに書いてたもので、いちおうわりと知識がなくても頭からおっていけば忘れてからでも分かるように丁寧に書いたつもりですが、文体とか構成とか基礎知識がおかしいところには目をつむってくだしあ

Ruby開発環境やツールの学習

rubyの構文やルール以前にrubyを使った開発におけるいろいろな概念やツールを学ばなきゃいけない。さらにはweb開発全体のアーキテクチャも絡んでくる。開発経験がないので何をどう調べればいいかすらわからなかったのだが、PCの前でクネクネしてたら少しずつ分かりを得てきたので整理する。

rbenv

rubyのバージョン管理ツール。まずはこれをhomebrewなりなんなりで入れるのが第一。
バージョン管理というかバージョンを切り替えるツールと言ったほうが正しいかもしれない。導入は以前これでやったのでスルー。

gem

rubyパッケージとかrubyライブラリとかそういう感じ。たいていはgithubrubygemというgemのホスティングサービスで入れるのが多そう。

Rubygems

gemを管理する、つまりパッケージ管理ツール。gem installほにゃららとか、gem searchほにゃらら、みたいな使い方するといえばあとは分かるだろう。2.x.x以上のrubyにはデフォルトで組み込まれている。

基本的なコマンドやオプションはrubygems-basicsを見たらわかる。だいたいこれ使えたらusage的には困らないと思われる。コマンドの一覧はcommand-reference参照。

公式のメニューをみてみると、あとは gemの構造, gem自作, rubygemsAPIみたいな項目。resourcesチュートリアルのリンク集みたいな感じで参考になる(多すぎるので読んでない)。

gemを使ってみる

の前に、rbenvで使い捨ての環境を作る。

グローバルにrubyを入れる

以前これでもうやった

rbenv versions
* system (set by /Users/hal/.rbenv/version)
  2.5.0
  2.5.1

プロジェクト作る

適応なディレクトリに作る。ここではrbenv_testとした

プロジェクトルート直下に(ローカルの)rubyを入れる

rbenv local 2.5.1

すると、果たして.ruby-versionが作られた。中身は単純にバージョンが一行書かれているだけ。ふつうに書き換えれば参照が変わる。

入ってるgem一覧 gem list

gem list

すると、果たしてなんかデフォルトで入ってくるっぽいgemがずらっと並んだ。

入ってないやつをインストール/更新/削除してみる

入ってないやつ探す。(後述のオプションでもいけるけど無意味にgrepを使った)

gem list | grep rails

railsは入ってないらしい。よしrailsを入れよう

gemでrailsを探して入れるまで

gemを探す。gem名は正規表現的な書き方が使えるらしい。-aオプションですべてのバージョンを対象に探せる。

gem search ^rails$ -a

railsめっちゃ出てくる。

gem install

現時点で最新は5.2.0らしいが、あとで更新するためにわざと最新じゃないやつを入れてみる。バージョン指定は-vオプション(など)。バージョン指定なしだとlatestが入る。

gem install rails -v 4.2.10

それなりに時間がかかる。rails以外にすりゃよかった...gemってrailsしか知らんけど....
ぜんぶで32個の依存しているgemがインストールされたっぽい(もとからあったのも含めて新たに入ったのかは不明)

入ってるかどうか確かめてみる。gem listで一覧を目で追ってもいいが、これでもいい

gem search ^rails$ -v 4.2.10 -i
true
gem search ^rails$ -v 5.2.0 -i
false

最新じゃなくてちゃんと指定したバージョンが入ってる。

gem update

更新してみる。特にバージョン指定するオプション無しだとlatestが入る。

gem update rails

見てみると、

gem list ^rails$

*** LOCAL GEMS ***

rails (5.2.0, 4.2.10)

えぇ...古いやつも残るのか...

gem uninstall

削除してみる。

gem uninstall rails -a
Successfully uninstalled rails-4.2.10
Successfully uninstalled rails-5.2.0

依存するgemは当然ながら無傷。

このままだとグローバルなrbenvにgem installされてしまう

上記のようにしたあと、新たに別のプロジェクトルートでrbenv localすると、同じバージョンのdefault gemsに加えて、上記でgem installしたgemが入った状態になっている。つまり、選択したグローバルが侵されている状態。

Bundlerを使うとプロジェクトごとにgemを管理できるので、これを解決できる。

Bundlerの説明でよく書いてあるのが 「gemの依存関係を管理するツール」 という文句だが、その説明ではまったくピンとこなかったのだが要はこういうことだと理解した。認識が合っているかは不明。

Bundler

※ここで、先程のrbenvのグローバルが侵されているのでとりあえず入れ直す。他に手があるのかもしれないがめんどくさいので再インストールした。

rbenv uninstall 2.5.1
rbenv install 2.5.1
rbenv local 2.5.1

きれいになったところでBundler。

Bundler 参考

Rubyのgemをプロジェクト毎にBundlerで管理する曰く、

なぜBundlerを使うのか
gemは更新頻度が高く、互換性が無くなってアプリケーションが動かなくなったりする場合があります。
その問題を解決できるのがBundlerというgem管理ツールです。
また、開発チームのメンバー間で環境構築の際にどのバージョンのgemをインストールするかをBundlerに任せることができます。
Ruby自体のバージョンは、プロジェクト毎にrbenvで管理する。
gemのバージョンは、プロジェクト毎にBundlerで管理する。
というイメージです。

Bundler入門
公式の邦訳

あらためてBundlerに関して理解する
少し古い記事。Gemfilesのバージョンの書き方とか。

【ruby】macでrbenv x bundlerでgemを管理するまでの爆速あんちょこ
必要最低限これだけ理解できればよさそう

bundler_memo.md
導入からgemfilesまとめてデプロイまで。非常によくまとまっている気がする

Bundlerを入れる

グローバルにはBundlerだけ入れる。 これはいろんな記事でも書かれていた。

gem install bundler

時間はかからない。

【rbenv rehashについて】

世の記事には gem installのあとはrbenv rehashするべき という文句が書かれているものもある(直近でここ1年ものの記事もあった)が、公式を見ると

This plugin is deprecated since its behavior is now included in rbenv core.

とあるので 必要ない。

初期化

プロジェクトルートで

bundle init

すると、果たしてGemfileファイルが作られた。

Gemfile

ここに所定の書式でgemの入手先とgem名とバージョンの指定なんかを書いていく。デフォルトでrubygems.orgとgithubから入手するフォーマット、あとサンプルとしてrailsを入れる態で書いてある(コメントアウトされていた)。

いれてみる

作成されたGemfileをちょろっといじってrailsを指定してみる(また時間がかかることはもうわかってるんだけどまあ流れで...)

# frozen_string_literal: true

source "https://rubygems.org"

gem "rails"

そして

bundle install --path vendor/bundle

すると、新たにvendorディレクトリと.bundleディレクトリとGemfile.lockファイルが作られ、vendor/bundle/ruby/2.5.0ディレクトリ以下になんかたくさん入った。

2.5.1ではなく2.5.0なのは、bundlerではrubyのティーニーバージョンは無視してマイナーバージョンごとに管理する、ということらしい(参考

なんだこいつら

.bundle/configにはbundlerがgemをインストールする先のパスが書かれている。最初にbundle installすると作成され、以降そのディレクトリにgemがインストールされる。

BUNDLE_PATH: "vendor/bundle"

--pathオプションをつけないとグローバルのrubyにインストールされてしまう。一度インストールするとbundlerはBUNDLE_PATHを参照するのでオプションつけるのは最初だけでいい。
ディレクトリがvendor/bundleなのは、単にそういう名前が推奨されているから、らしい

Gemfile.lockはGemfileに書かれたgemとそのバージョンにおいて依存性が衝突しないように網羅して実際にインストールされたgemの一覧らしい。
これを他のマシンや開発環境にもっていけばbundlerがこのリストに基づいてgemを管理するため、同じ開発環境を構築できる、ということであるらしい。

vendor/bundle/ruby/2.5.0以下に入る大量のファイルはgemなので気にしなくていい。

bundle exec

bundleでいれたgemを確認するには単にrails -vでは駄目で、これはグローバルを参照している。
正しくはbundle exec rails -vとする。このように、bundleで入れたgemを使うときはbundle execを使う。いちいち書くのがめんどくさいのでbundle install時に書かなくて済むようになるオプション--binstubsが用意されている。

せっかくなのでrailsを入れて動かしてみる

Rails開発環境の構築(複数バージョン共存可能)(Homebrew編)
[Sy] Railsの環境構築でグローバルのgemを汚さずにプロジェクト内にbundle install する手順
Bundler概要
を参考にしました。ありがとうございます。

bundle exec rails new my_first_rails_proj --skip-bundle

railsには最初からbundlerが入っており、newするとbundle installが走る仕組みになっているらしく、グローバルに不意にgemが入ってしまう。それを防ぐために--skip-bundleオプションをつける。

bundlerでできた各フォルダやファイル(Gemfile, Gemfile.lock, .bundle, vendorディレクトリ)は不要なので消す。

cd my_first_rails_proj
bundle install --path vendor/bundle

さきほどのrails new --skip-bundleでは必要最低限のフォルダやファイルが作られるが、bundle installをしていないため、railsで必須になるgemが一切入っていない。なのでここでちゃんとbundle installしておく。

bundle exec rails server

railsのポートは3000らしい。http://localhost:3000/で動いているのを確認したらCtr+Cでrailsを停止しておく。ここでそのままターミナルを閉じようものならkill pidしなきゃならずめんどくさいので。

続き

別の記事で書いていく予定です。Rake, Rspec, gemspecあたり、あとなんかあるかな