细说Ruby工程的Bundle以及怎么加快bundle install

Python011

细说Ruby工程的Bundle以及怎么加快bundle install,第1张

细说Ruby工程的Bundle以及如何加快bundle install

做过Ruby项目的人可能有过我一样的感受,rubygems.org在中国的访问太慢了,每次我们bundle install都要等老长时间,而我们通过浏览器去下载对应的gems文件时却速度刷刷的。。。 为什么会出现这样的情况呢? 明明我们在Gemfile中写的是:

source ""

好了,既然bundle install很慢,那我就去下载gem文件下来到本地,然后运行:

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

结果发现,有些gem文件安装速度很快,有些bundle安装很慢。 为啥呢? 我们又如何去避免这样的痛苦呢?

好,那下面我就先来详细说明一下ruby的bundle机制。

首先说一下Gemfile文件,Gemfile就是用来描述你当前ruby工程需要依赖的插件bundle,好比在java的插件工程,当前工程会依赖哪些其他插件,依赖的插件有版本区别。比如下面就是我的一个简单ruby工程的Gemfile文件内容:

source ""

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 ""

然后运行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说明

在Ruby中,我们如果需要调用 module 的话可以使用 extend 、 include 、 prepend ,但是这些关键字具体有哪些区别呢。

现在我们在 Person 类中使用 extend 关键字来调用模块,使用相关方法,并且打印出相关信息。

我们由 Person.introduce 和 Person.current_time 可以观察出来 extend 关键字的作用是为 Person 添加了2个类方法。

上面两个类调用的方法都报错了可以看出, include 和 extend 相反, include 是为类中添加的实例方法,而不是类方法。

prepend 和 include 同样都是为类中添加实例方法,但不同之处在于,引入模块后的方法链会有一点区别

我们先看看 include 的方法链

再看看 prepend 的

可以看出 FooModule 和 Person 的顺序有什么不同,那么具体不同体现在哪,接下来我们调用方法就可以看出区别了。

include

prepend

可以看到,如果使用 prepend 的话我们会优先去查找 FooModule 中的 introduce 方法(如果 FooModule 没有 introduce 方法话,会依次去祖先链的上一级去查找 introduce 方法),而 include 是优先在 Person 中去查找。

在Mac OS X上安装 Ruby运行环境:

在安装CocoaPods之前要先配置好RUBY环境,本文就怎么安装RUBY的环境进行一总结。安装Ruby环境首先需要安装Xcode然后需要安装Homebrew,接下来需要安装RVM最后安装Ruby环境。

Homebrew是一个包管理器,用于在mac上安装一些os x上没有的UNiX工具。Homebrew将这些工具统统安装到了 /usr/local/Cellar 目录中,并在 /usr/local/bin 中创建符号链接。

1.中文地址:http://brew.sh/index_zh-cn.html

打开终端(Terminal)把以下粘贴到终端内

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装过程中需要按回车确认(Press enter to continue)安装完后可以通过brew doctor命令检查是否安装成功,如果提示"Your system is ready to brew."就可以使用了。可以参考:http://blog.csdn.net/maojudong/article/details/7918291

2.安装设置RVM

命令:curl -L https://get.rvm.io | bash -s stable

期间会问你管理员的密码,以及自动通过homebrew安装依赖包,等待一段时间后就可以成功安装好 RVM。 然后,载入 RVM环境(新开 Termal 就不用这么做了,会自动重新载入的)

3. 设置RVM

通过以下命令启用RVM

source ~/.rvm/scripts/rvm

检查一下是否安装正确命令

rvm -v

正确的话会出现类似下面的文字

rvm 1.26.11 (master) by Wayne E. Seguin [email protected]>, Michal Papis [email protected]>[https://rvm.io/]

4.安装RUBY

rvm install 2.0.0

漫长的等待下载过程,安装完成后需要执行下面的命令指定哪个RUBY为系统默认的

rvm 2.0.0 --default