[Tips] rbenvでrubyのダウンロードが遅い時の対処法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

モバイルアプリサービス部の五十嵐です。

先日、rbenvでrubyをインストールしようとしたところ、CDNからのダウンロードが非常に遅くインストールに手間取ったことがありましたので、対処方法を共有します。

なお、rbenvの基本的な情報を知りたい場合は以下も合わせてご覧ください。

通常のインストール方法

まずは通常のインストールから見ていきます。rbenv installコマンドにバージョン番号を渡すと、CloudFront(CDN)にあるソースコードをダウンロードし、コンパイルまでを行ってくれます。

$ rbenv install 2.2.1
Downloading ruby-2.2.1.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/5a4de38068eca8919cb087d338c0c2e3d72c9382c804fb27ab746e6c7819ab28
Installing ruby-2.2.1...
Installed ruby-2.2.1 to /Users/user_name/.rbenv/versions/2.2.1

ちなみにCDNのURLはruby-buildのソースコードにベタ書きされています。

CDNが遅い場合の対処方法

CloudFront(CDN)からのダウンロードが遅い場合、環境変数のRUBY_BUILD_SKIP_MIRRORを有効にすることで、オリジナルのURLからダウンロードすることができます。

$ RUBY_BUILD_SKIP_MIRROR=1 rbenv install 2.2.1
Downloading ruby-2.2.1.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.1.tar.gz
Installing ruby-2.2.1...
Installed ruby-2.2.1 to /Users/user_name/.rbenv/versions/2.2.1

ダウンロードするURLが変わりました。

ちなみにこのURLはどこに定義されているかというと、ruby-buildのインストールフォルダ以下のshare/ruby-buildにバージョンごとのdefinitionファイルというファイルがあり、そこにURLとチェックサムがセットで定義されています。

オリジナルサイトも遅い場合の対処方法

オリジナルのサイトもダウンロードが遅い場合、先ほどのdefinitionファイルのURLとチェックサムをうまく書き換えてあげれば別のミラーサイトからダウンロードできるかもしれませんが、もっと簡単な方法があります。

rbenv installコマンドは、ダウンロードしたソースコードのファイルをローカルにキャッシュすることができます。別のミラーサイトからダウンロードしたソースコードのファイルを、rbenvが参照するcacheフォルダに置いてあげれば良いわけです。やってみましょう。

デフォルトのcacheフォルダのパスは ~/.rbenv/cache ですが、デフォルトではフォルダが作られませんので、cacheフォルダを作ります。デフォルトのバスがわからない場合は、環境変数のRUBY_BUILD_CACHE_PATHにパスを指定することもできます。

$ mkdir ~/.rbenv/cache && cd ~/.rbenv/cache

次に任意のミラーサイトからrubyのソースコードをダウンロードします。ミラーサイトの一覧はMirror Sitesにあります。

$ curl -O https://ftp.ruby-lang.org/pub/ruby/2.2/ruby-2.2.1.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 15.7M 100 15.7M 0 0 299k 0 0:00:53 0:00:53 --:--:-- 428k

そして、インストールします。

$ rbenv install 2.2.1
Installing ruby-2.2.1...
Installed ruby-2.2.1 to /Users/user_name/.rbenv/versions/2.2.1

先ほどはダウンロードから始まりましたが、今回はソースコードが既にcacheフォルダにあるので、ダウンロードが省略されたことが分かります。これで遅いダウンロードを待つ必要がなくなりました!

まとめ

いかがだったでしょうか。ご紹介した方法の他にも、CDNのURLを書き換えたり、環境変数のRUBY_BUILD_MIRROR_URLを使ったり試行錯誤してみたんですが、そちらは上手くできませんでしたので、知見をお持ちの方はコメントなどで教えていただけると幸いです。また、キャッシュを使う方法はrbenvに限らず一般的な方法なので覚えておくと良いかもしれません。例えば、gemも同じようなキャッシュの仕組みを持っており、同じ方法が使えます。

参考