作过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说明