2019-04-07
もろもろメモ(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
プラクティス
gem をアプリケーションごとに分けて管理する方法
- ここからは bundler をつかう前提の話。
- ふつうに
bundle install
してしまうと、上記のようにディレクトリに放り込まれてしまい、アプリケーションごとの管理ができなくなる。 - アプリケーションごとの 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 階層下までに指定- べんりー。
パッケージ管理ツール
- OS 別
- macOS
- homebrew
- CentOS
- yum
- Debian 系
- apt
- macOS
- 言語別
- Node.js
- npm, yarn
- Ruby
- gem
- Node.js
よく知らんかった用語たち
- コンパイル
- 機械語に翻訳すること
- リンク
- コンパイル済みのオブジェクトコードを互いに関連付けること
- 以下の 2 種類がある
- 静的リンク:実行前に 1 つの実行モジュールを生成する
- 動的リンク:実行時に都度関連するファイルを参照する
- ビルド
- アプリケーション全体についてコンパイルとリンクを実行すること
- ビルドされてはじめて実行可能、インストール可能となる
- .so ファイル
- Linux 系 OS において、動的にリンクされるライブラリ
- shared object の略。動的リンクゆえに複数のアプリケーションで共有できることから。
- Make, Rake
- ビルド作業を自動化するツール
- すなわち、一定のルールに従ってコンパイル、リンク、インストールをまとめて実行してくれる
- その一定のルールを記述するのが Rakefile
- Make は Ruby でつくられている
- Rake はビルドに限らず、一般に記述されたタスクを順番に実行するツールとして使える
- Homebrew の特徴
- 前提:パッケージ管理ツールには、初めからバイナリファイルを取得するものと、ソースコード取得後にビルドしてローカルでバイナリファイルをつくるものがある。
- Homebrew は後者であり、ローカルでビルドすることを home で命名されている。
- brew(build)された beer(package)は cellar(/usr/local/Cellar)に保存される。
- Ruby で書かれている。