k-tokitoh

もろもろメモ(rbenv, bundlerなど)

2019-04-07

ごちゃまぜのメモ。

rbenv

参考にしたもの

各バージョンの 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
  • 言語別
    • Node.js
      • npm, yarn
    • Ruby
      • gem

よく知らんかった用語たち

  • コンパイル
    • 機械語に翻訳すること
  • リンク
    • コンパイル済みのオブジェクトコードを互いに関連付けること
    • 以下の 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 で書かれている。