There's an echo in my head

日々のメモ。

Gemfileを分割すればbinstubしたコマンドがもっと早く起動するかと思ったけどそんなことはなさそう

経緯

Gemfileのなかでrailscapistranoの両方を書いていたら、capコマンドを実行するたびにrailsを読み込んで無駄じゃないのか?せっかくbinstubしたスクリプトのなかでGemfileを指定してるんだから、それをcapistrano用に分割すればcapコマンドがもうちょっと早く起動するんじゃないか?と思った次第。

結論

binstubしたスクリプトのなかではbundler/setupを使って$LOAD_PATHをシステムのものからbundlerでインストールしたものに置き換えたうえで、Gem.bin_pathを使って必要な実行ファイルとライブラリを読み込み、実行している。

つまりすでにコマンドの実行に必要なgemのみを読み込むようになっているので、特定のコマンドのためにGemfileを分けるのは効果がない。

もしかしたらGemfile.lockに挙げられているgemがものすごく多ければパスの置換に時間がかかるかもしれないけど、普段はそこまでの効果はなさそう。

おまけ: Gemfileを分割する方法

このへんを参考にやった結果がこちら

コミットログをみてもらうのが一番わかりやすい。

  • Gemfile.capistranoをGemfileで読み込んでいるので、インストールはbundle installだけでいい
  • bundle binstubで生成したスクリプト中のBUNDLE_GEMFILEGemfile.capistrano用に置き換えた
  • Gemfile.capistrano.lockははじめてbin/cap installを実行したタイミングで生成された
このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。