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

本站公众号
   欢迎关注本站公众号,获取更多信息