もろもろメモ(rbenv, bundlerなど)
ごちゃまぜのメモ。
rbenv
参考にしたもの
- 結局READMEが一番わかりやすい。
- READMEに至るまでに以下の日本語記事で徐々に理解を広げた。
各バージョンのruby実行ファイルはどこに保存されるか
- もともと/usr/binにrubyとかgemとかのバイナリファイルが入っている。
rbenv install 2.3.3
とかすると、/Users/takashi/.rbenvというディレクトリが以下のようになる。
% cd /Users/takashi/.rbenv % tree -L 3 . ├── shims │ ├── erb │ ├── gem │ ├── irb │ ├── rake │ ├── rdoc │ ├── ri │ └── ruby ├── version └── versions ├── 2.3.3 │ ├── bin │ ├── include │ ├── lib │ └── share └── 2.5.1 ├── bin ├── include ├── lib └── share
versionにはglobalで指定するversionが記載されている。
% cat /Users/takashi/.rbenv/version 2.3.3
versions以下の各ディレクトリに、各バージョンの中身が入っている。
コマンドを打つとその場面で指定されているバージョンが実行される仕組み
- 環境変数の設定
export PATH=$HOME/.rbenv/shims:$PATH
.zshrcに以下を追記する。
これで例えばrubyというコマンドを打ったときに、もともとインストールされている/usr/bin/ruby
よりも先に$HOME/.rbenv/shims/ruby
が見つかる。
このshimsの実行ファイルは、現在適用されているversionにおけるrubyコマンドを呼び出す。
例えば、/Users/takashi/.rbenv/versions/2.3.3/bin/ruby
などである。
shimという言葉
- 一般的には詰め木
- プログラミング用語としては「プログラムのバージョン間の差異を埋める緩衝材のように使う薄いレイヤーみたいなもの」
- 参考:Shimの意味 - Qiita
- なるほど、rbenvでshimsが果たしている役割もそれだ。
rehash
上記の仕組みが成立するには、各バーションがもっているコマンドが漏れなくshimsに存在せねばならない。
現在インストールされているバージョンたちを元にして、shimsがコマンドたちを網羅するよう更新する作業が必要だ。
これを実現するのが、rbenv rehash
というコマンドである。
バージョン切り替え
- 各ディレクトリでバージョン指定する様子が以下。
% cd % rbenv version 2.3.3 (set by /Users/takashi/.rbenv/version) % mkdir sample % cd sample % ls -a . .. % rbenv local 2.5.1 % rbenv version 2.5.1 (set by /Users/takashi/sample/.ruby-version) % ls -a . .. .ruby-version % cat .ruby-version 2.5.1
gem関係
- バージョンごとの保存場所
% rbenv versions system * 2.3.3 (set by /Users/takashi/.rbenv/version) 2.5.1 % gem env home /Users/takashi/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0 % rbenv local 2.5.1 % gem env home /Users/takashi/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0
rails newのベスト・プラクティス
gemをアプリケーションごとに分けて管理する方法
- ここからはbundlerをつかう前提の話。
- ふつうに
bundle install
してしまうと、上記のようにrubyのバージョンごとに用意されたディレクトリに放り込まれてしまい、アプリケーションごとの管理ができなくなる。 - アプリケーションごとのgemの置き場所は一般的に
vendor/bundle
とすることが多いらしい。 bundle install --path=vendor/bundle
と書けばOK.- インストール先は
.bundle/config
に保存されるので、次回以降単にbundle install
としてもvendor/bundle
にインストールしてくれるらしい。
Railsのアプリケーションごとにgemを管理する
% mkdir sample-app % cd sample-app % bundle init
Gemfileにrailsを記載
% bundle install --path=vendor/bundle % bundle exec rails new . --skip-bundle(or -B)
tree
brew install tree
でインストールtree -L 2
で2階層下までに指定- べんりー。