bundler/gem_tasks の rake install から gem build・install を通って gem が install されるまでの旅路

やんごとなき事情により bundler の gem_tasks の動作を確認する必要があったのでコードを読みました。
bundler/gem_tasks の rake install から gem build・install を通って gem が install されるまで
何が起こっているかコードリーディングをします。

## <i class='fa fa-cube'></i> bundle/gem_tasks
Bundler の gem_tasks ファイルから読み進めます。
gem_task の `rake install` は build_gem => install_gem の順で内部処理が呼び出されます。

[gem_helper.rb - L38-L46 - bundler/bundler -GitHub](https://github.com/bundler/bundler/blob/02e7f67727b45f59ec0aec4df410e05921d94928/lib/bundler/gem_helper.rb#L38-L46)

### <i class='fa fa-check-circle'></i> build_gem
* [gem build](http://guides.rubygems.org/command-reference/#gem-build) コマンドを実行して Ruby プロジェクトのビルドを実行します。これだけ。

[gem_helper.rb - L74-L83 - bundler/bundler -GitHub](https://github.com/bundler/bundler/blob/02e7f67727b45f59ec0aec4df410e05921d94928/lib/bundler/gem_helper.rb#L74-L83)

### <i class='fa fa-heck-circle'></i> install_gem
* gem build で作成した gem を [gem install](http://guides.rubygems.org/command-reference/#gem-install) します。これだけ

[gem_helper.rb - L85-L90 - bundler/bundler -GitHub](https://github.com/bundler/bundler/blob/02e7f67727b45f59ec0aec4df410e05921d94928/lib/bundler/gem_helper.rb#L85-L90)

## <i class='fa fa-diamond'></i> RubyGems
`rake install` の処理のうち、 bundler 側が受け持っているのは gem build と gem install の呼び出し部分でした。
実際のビルド・インストール処理本体を確認するために RubyGems(gem コマンド) のコードを読みます。

### <i class='fa fa-heck-circle'></i> gem build
各リンクは対応するソースコードへのリンクになっています。

* [gemspec を読み取る](https://github.com/rubygems/rubygems/blob/6cc75940353fd35218dc3f9bb4d7e8d0271bdb6b/lib/rubygems/specification.rb#L1146-L1180)
    * [gemspec の中身を eval してる](https://github.com/rubygems/rubygems/blob/6cc75940353fd35218dc3f9bb4d7e8d0271bdb6b/lib/rubygems/specification.rb#L1164)
* [spec の内容を validation する](https://github.com/rubygems/rubygems/blob/6cc75940353fd35218dc3f9bb4d7e8d0271bdb6b/lib/rubygems/specification.rb#L2644-L2669)
* [gem ファイルを作成する](https://github.com/rubygems/rubygems/blob/6cc75940353fd35218dc3f9bb4d7e8d0271bdb6b/lib/rubygems/package.rb#L254)
    * [metadata(gemspec に設定した内容) を metadata.gz として保存](https://github.com/rubygems/rubygems/blob/6cc75940353fd35218dc3f9bb4d7e8d0271bdb6b/lib/rubygems/package.rb#L232-L240)
    * [spec.files の中身を data.tar.gz として保存](https://github.com/rubygems/rubygems/blob/6cc75940353fd35218dc3f9bb4d7e8d0271bdb6b/lib/rubygems/package.rb#L194-L204)
    * [checksum を checksum.gz 保存](https://github.com/rubygems/rubygems/blob/6cc75940353fd35218dc3f9bb4d7e8d0271bdb6b/lib/rubygems/package.rb#L172-L181)

### <i class='fa fa-heck-circle'></i> gem install
各リンクは対応するソースコードへのリンクになっています。

* [gem をインストールする](https://github.com/rubygems/rubygems/blob/d8293c472966cb1de08784dfdd90560e56ceed84/lib/rubygems/commands/install_command.rb#L142-L163)
    * [依存ライブラリのインストール](https://github.com/rubygems/rubygems/blob/af3c7bed24106cb86ad56210fcb90696d00c31d5/lib/rubygems/request_set.rb#L219-L252)
    * [gem のインストール](https://github.com/rubygems/rubygems/blob/d8293c472966cb1de08784dfdd90560e56ceed84/lib/rubygems/commands/install_command.rb#L248-L269)

## <i class="fa fa-pencil" style="font-size:1em;"></i> おまけ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">コードリーディングについて以前に調べて実践したことを忘れてコードリーディングしていたことに気づいたので復習しますよ。<a href="https://t.co/Ffbr2utfcA">https://t.co/Ffbr2utfcA</a></p>&mdash; てぃーびー📺 (@tbpgr) <a href="https://twitter.com/tbpgr/status/834359347169746944">2017年2月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [gem_helper.rb - bundler/bundler - GitHub](https://github.com/bundler/bundler/blob/master/lib/bundler/gem_helper.rb)