[Tips] rbenvでrubyのダウンロードが遅い時の対処法
モバイルアプリサービス部の五十嵐です。
先日、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も同じようなキャッシュの仕組みを持っており、同じ方法が使えます。