我们都知道Debian/Ubuntu通过apt-get安装的ruby包很慢(参考:各种Ruby实现的性能评测修正版本 )
通常我们都是通过自己从www.ruby-lang.org上下载源码并编译安装ruby来绕过这个问题,并且自己编译还可以打上各种补丁,比如这个(解决ruby 内存泄漏的超级大补丁发布啦 )
但是自己编译的ruby不能被dpkg -l识别,debian/ubuntu系统中有些包是依赖于ruby包的,安装这些软件包会要求安装ruby包,这样系统中就有两个(或者更多)ruby。虽然这在大部分情况下都不是问题,但是有些脚本在开头不是使用env来获得ruby而是hardcode #/usr/bin/ruby,这个时候就有问题了。
debian/ubuntu apt-get得到的ruby(v1.8.7.72) 之所以会有性能问题(慢50%),是因为仓库中的是debug版本,而且编译目标是i486平台,拖累了性能,我们可以通过去掉调试标志,指定到i686平台,重新编译deb包来解决这个问题。
1) 准备编译依赖包:
sudo apt-get build-dep ruby1.8
2) 取得deb包源码:
mkdir -p ~/build && cd ~/build
apt-get source ruby1.8
3) 修改编译参数:
cd ~/build/ruby1.8-1.8.7.72/debian
修改rule文件,去掉CFLAGS中的"-g ", 并在头部加上:
export DEB_BUILD_GNU_TYPE=i686-linux-gnu export DEB_BUILD_GNU_CPU=i686 export DEB_HOST_GNU_CPU=i686 export DEB_HOST_GNU_TYPE=i686-linux-gnu
4) 编译:
cd ~/build/ruby1.8-1.8.7.72 && debuild -uc -us
5) 安装:
cd ~/build && sudo dpkg -i *.deb
如果要打其他补丁(如MBARI补丁),可以在步骤3和4之间进行。
这样,系统中就只有一份本地编译优化过的ruby,所有使用到ruby的包都将受益。