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

ごちゃまぜのメモ。

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

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階層下までに指定
  • べんりー。

パッケージ管理ツール

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

  • コンパイル
  • リンク
    • コンパイル済みのオブジェクトコードを互いに関連付けること
    • 以下の2種類がある
      • 静的リンク:実行前に1つの実行モジュールを生成する
      • 動的リンク:実行時に都度関連するファイルを参照する
  • ビルド
    • アプリケーション全体についてコンパイルとリンクを実行すること
    • ビルドされてはじめて実行可能、インストール可能となる
  • .soファイル
    • Linux系OSにおいて、動的にリンクされるライブラリ
    • shared objectの略。動的リンクゆえに複数のアプリケーションで共有できることから。
  • Make, Rake
    • ビルド作業を自動化するツール
    • すなわち、一定のルールに従ってコンパイル、リンク、インストールをまとめて実行してくれる
    • その一定のルールを記述するのがMakefile, Rakefile
    • MakeはC言語で、RakeはRubyでつくられている
    • Rakeはビルドに限らず、一般に記述されたタスクを順番に実行するツールとして使える
  • Homebrewの特徴
    • 前提:パッケージ管理ツールには、初めからバイナリファイルを取得するものと、ソースコード取得後にビルドしてローカルでバイナリファイルをつくるものがある。
    • Homebrewは後者であり、ローカルでビルドすることをhomeでbrewすることに例えて命名されている。
    • brew(build)されたbeer(package)はcellar(/usr/local/Cellar)に保存される。
    • Rubyで書かれている。