做過Ruby項目的人可能有過我一樣的感受,rubygems.org在中國的訪問太慢了,每次我們bundle install都要等老長時間,而我們通過瀏覽器去下載對應的gems檔案時卻速度刷刷的。。。 為什麼會出現這樣的情況呢? 明明我們在Gemfile中寫的是:
- source "http://rubygems.org"
好了,既然bundle install很慢,那我就去下載gem檔案下來到本地,然後運行:
- gem install /path/to/gems/***.gem
結果發現,有些gem檔案安裝速度很快,有些bundle安裝很慢。 為啥呢? 我們又如何去避免這樣的痛苦呢?
好,那下面我就先來詳細說明一下ruby的bundle機制。
首先說一下Gemfile檔案,Gemfile就是用來描述你當前ruby工程需要依賴的外掛程式bundle,好比在java的外掛程式工程,當前工程會依賴哪些其他外掛程式,依賴的外掛程式有版本區別。比如下面就是我的一個簡單ruby工程的Gemfile檔案內容:
- source "http://rubygems.org"
-
- gem "rspec", "~> 2.7.0"
- gem "rake", "~> 0.9.2.2"
第一行說明我bundle下載的伺服器
第3行和第4行說明我當前工程需要依賴rspec外掛程式和rake外掛程式
"~> 2.7.0"表示需要對於的版本好為 >= 2.7.0 而且 <= 2.8.0
在運行調用代碼之前都需要先bundle install好對於的外掛程式bundle
但是寫了Gemfile就需要安裝bundler外掛程式,這個完全可以通過下面的命令來完成
gem install /path/to/gem/bundler-version.gem
先下載bundler gem檔案到local)
好了,安裝好了bundler,就可以執行bundle install了。
但是每次都執行bundle install都很慢很慢,讓我無法承受。怎麼辦?
下載到本地然後gem install,發現如果外掛程式有依賴的話,還是同樣很慢,因為它會自動訪問伺服器去下載需要依賴的外掛程式。既然我本地可以通過瀏覽器直接下載下來我需要的bundle,能否直接利用到本地的? 答案是可以的。
我們完全可以搭建一個本地的gem mirror伺服器,而且非常簡單。
首先,下載好所有的gem檔案其實就是bundle檔案),注意依賴外掛程式也必須準備好,放在本地某個目錄中。 然後在這個目錄中執行下面命令:
- gem generate_index -d /path/to/your/gemfiles/
-
- cd /path/to/your/gemfiles/
-
- gem server
然後修改你的Gemfile的source,改成如下:
source "http://0.0.0.0:8808"
然後運行bundle install,看到的結果一定是讓你激動的效果~
最後,建議每個ruby工程目錄中增加一個.rvmrc檔案,這個檔案就是用來指定你該工程使用的ruby版本,已經bundle安裝目錄和cache目錄。.rvmrc的內容只有一句話:
- 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說明
本文出自 “享受編程人生” 部落格,請務必保留此出處http://huihua.blog.51cto.com/3865128/706748