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

Python030

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

刚开始使用redmine时

方法一:

可以采用nginx+passenger的方式来驱动redmine提升访问速度,但是在新建问题或更新问题时变得非常慢,这是因为在新建问题和更新问题时会发送邮件,而且是同步操作的,就是说需要等到邮件发送成功后才会返回。(可以用方法二解决此问题,将发送邮件的方式改为异步操作)

方法二:

我的目录C:\Bitnami\redmine-3.0.2-0\apps\redmine\htdocs\config

1. 进入redmine目录下的config目录;

2. 编辑configuration.yml;

3. 找到 delivery_method: :smtp,将smtp改为async_smtp,保存退出;

4. 重启服务即可解决;

(只想解决新建问题访问慢的问题可以直接忽略方法一)

解决Redmine局域网访问缓慢问题

redmine 2.1.4,访问巨慢无比,使用的ruby 1.9.1,rails 3.2.8

查阅网上意见,发现是由于Redmine自带的WebrickWeb发布的问题,需要使用Mongrel组件来替换Webrick。

究其原因是Remine的默认服务器webrick需要解析目标地址的主机名。

1. 替换其自带的服务器webrick 为mongrel,方法:

gem install mongrel

rails 3.1以上执行

sudo gem install mongrel --pre

2. 修改redmine下gemfile

在gemfile中加入

1

gem 'mongrel'

如果安装的mongrel pre,则gemfile当中加入

1

gem 'mongrel','~>1.2.0.pre2'

3. 删除gemfile.lock文件,重新执行

sudo bundle install

4. 执行

sudo ruby script/rails server mongrel -e production -p 3000

速度快了好多!