最近っつっても一月くらい前に書いて以降ほったらかしにしてたやつです。長いので目次付きです。
自分用のメモ代わりに書いてたもので、いちおうわりと知識がなくても頭からおっていけば忘れてからでも分かるように丁寧に書いたつもりですが、文体とか構成とか基礎知識がおかしいところには目をつむってくだしあ
Ruby開発環境やツールの学習
rubyの構文やルール以前にrubyを使った開発におけるいろいろな概念やツールを学ばなきゃいけない。さらにはweb開発全体のアーキテクチャも絡んでくる。開発経験がないので何をどう調べればいいかすらわからなかったのだが、PCの前でクネクネしてたら少しずつ分かりを得てきたので整理する。
rbenv
rubyのバージョン管理ツール。まずはこれをhomebrewなりなんなりで入れるのが第一。
バージョン管理というかバージョンを切り替えるツールと言ったほうが正しいかもしれない。導入は以前これでやったのでスルー。
gem
rubyパッケージとかrubyライブラリとかそういう感じ。たいていはgithubかrubygemというgemのホスティングサービスで入れるのが多そう。
Rubygems
gemを管理する、つまりパッケージ管理ツール。gem install
ほにゃららとか、gem search
ほにゃらら、みたいな使い方するといえばあとは分かるだろう。2.x.x以上のrubyにはデフォルトで組み込まれている。
基本的なコマンドやオプションはrubygems-basicsを見たらわかる。だいたいこれ使えたらusage的には困らないと思われる。コマンドの一覧はcommand-reference参照。
公式のメニューをみてみると、あとは gemの構造, gem自作, rubygemsのAPIみたいな項目。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
gemでrailsを探して入れるまで
gem search
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あたり、あとなんかあるかな