作過Ruby項目的人可能有過我同樣的感覺,rubygems.org在中國的訪問太慢了,每次咱們bundle install都要等老長時間,而咱們經過瀏覽器去下載對應的gems文件時卻速度刷刷的。。。 爲何會出現這樣的狀況呢? 明明咱們在Gemfile中寫的是:php
- source "http://rubygems.org"
好了,既然bundle install很慢,那我就去下載gem文件下來到本地,而後運行:java
- gem install /path/to/gems/***.gem
結果發現,有些gem文件安裝速度很快,有些bundle安裝很慢。 爲啥呢? 咱們又如何去避免這樣的痛苦呢?node
好,那下面我就先來詳細說明一下ruby的bundle機制。web
首先說一下Gemfile文件,Gemfile就是用來描述你當前ruby工程須要依賴的插件bundle,比如在java的插件工程,當前工程會依賴哪些其餘插件,依賴的插件有版本區別。好比下面就是個人一個簡單ruby工程的Gemfile文件內容:sql
- source "http://rubygems.org"
-
- gem "rspec", "~> 2.7.0"
- 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文件),注意依賴插件也必須準備好,放在本地某個目錄中。 而後在這個目錄中執行下面命令:
- 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說明