Gem/Bundle/Rvm

作過Ruby項目的人可能有過我同樣的感覺,rubygems.org在中國的訪問太慢了,每次咱們bundle install都要等老長時間,而咱們經過瀏覽器去下載對應的gems文件時卻速度刷刷的。。。 爲何會出現這樣的狀況呢? 明明咱們在Gemfile中寫的是:php

 
 
 
 
  1. source "http://rubygems.org" 

好了,既然bundle install很慢,那我就去下載gem文件下來到本地,而後運行:java

 
 
 
 
  1. gem install /path/to/gems/***.gem 

結果發現,有些gem文件安裝速度很快,有些bundle安裝很慢。 爲啥呢? 咱們又如何去避免這樣的痛苦呢?node

 

好,那下面我就先來詳細說明一下ruby的bundle機制。web

首先說一下Gemfile文件,Gemfile就是用來描述你當前ruby工程須要依賴的插件bundle,比如在java的插件工程,當前工程會依賴哪些其餘插件,依賴的插件有版本區別。好比下面就是個人一個簡單ruby工程的Gemfile文件內容:sql

 
 
 
 
  1. source "http://rubygems.org" 
  2.  
  3. gem "rspec""~> 2.7.0" 
  4. gem "rake""~> 0.9.2.2" 

第一行說明我bundle下載的服務器瀏覽器

第3行和第4行說明我當前工程須要依賴rspec插件和rake插件ruby

"~> 2.7.0"表示須要對於的版本好爲 >= 2.7.0 並且 <= 2.8.0服務器

在運行調用代碼以前都須要先bundle install好對於的插件bundleide

 

可是寫了Gemfile就須要安裝bundler插件,這個徹底能夠經過下面的命令來完成spa

gem install /path/to/gem/bundler-version.gem 

(先下載bundler gem文件到local)

 

好了,安裝好了bundler,就能夠執行bundle install了。

可是每次都執行bundle install都很慢很慢,讓我沒法承受。怎麼辦?

下載到本地而後gem install,發現若是插件有依賴的話,仍是一樣很慢,由於它會自動訪問服務器去下載須要依賴的插件。既然我本地能夠經過瀏覽器直接下載下來我須要的bundle,可否直接利用到本地的? 答案是能夠的。

咱們徹底能夠搭建一個本地的gem mirror服務器,並且很是簡單。

首先,下載好全部的gem文件(其實就是bundle文件),注意依賴插件也必須準備好,放在本地某個目錄中。 而後在這個目錄中執行下面命令:

 
 
 
 
  1. gem generate_index -d /path/to/your/gemfiles/ 
  2.  
  3. cd /path/to/your/gemfiles/ 
  4.  
  5. gem server 

而後修改你的Gemfile的source,改爲以下:

source "http://0.0.0.0:8808"

而後運行bundle install,看到的結果必定是讓你激動的效果~

 

最後,建議每一個ruby工程目錄中增長一個.rvmrc文件,這個文件就是用來指定你該工程使用的ruby版本,已經bundle安裝目錄和cache目錄。.rvmrc的內容只有一句話:

 
 
 
 
  1. rvm --create use ruby-1.9.2@myprojectname 

而後你每次進到工程目錄種後都會看到自動切換到相應版本的ruby提示信息。

注意,第一次設置後,須要從新安裝bundler以及bundle install,緣由能夠本身想一下。

 

另外,每次修改Gemfile時,都須要bundle install一下,這個時候不會安裝全部的bundle,由於上次bundle install的時候會生成一個Gemfile.lock文件,告訴bundler哪些bundle已經安裝了,並且依賴關係也知道了。 此次只會安裝新增的bundle

 

連接:

1. Creating a RubyGems Mirror With HTTP Basic Authentication

2. Creating your own RubyGem mirror

3. Bundler說明

本站公眾號
   歡迎關注本站公眾號,獲取更多信息