部署 Install Ruby The "Postmodern" Way

hooopo for Shopper+ · 2014年07月09日 · 最后由 imlcl 回复于 2014年08月02日 · 10847 次阅读
本帖已被管理员设置为精华贴

上次发了一个帖子『别在服务器上装 RVM』,总结了在服务器使用 RVM 的各种坑。虽然这些坑在不断的 Google 之后都可以解决,最终你会觉得在服务器安装 RVM 带来的麻烦比便利多。

最终选择了ruby-install + chruby 这套组合。为什么叫“Postmodern”Way?因为这两个 gem 的作者都是 postmodern.

相比 RVM,ruby-install + chruby的特点就是简单、直接:

While I don't spend much time working on chruby/ruby-install due to their imposed simplicity, I do spend A LOT of time triaging issues.

Most of the chruby/ruby-install issues are either 1) misconfigurations 2) platform specific issues 3) upstream issues with MRI.

Install ruby-install

wget -O ruby-install-0.4.3.tar.gz https://github.com/postmodern/ruby-install/archive/v0.4.3.tar.gz
tar -xzvf ruby-install-0.4.3.tar.gz
cd ruby-install-0.4.3/
sudo make install

Install Ruby Using ruby-install

sudo ruby-install  -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/01-zero-broken-tests.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/02-improve-gc-stats.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/03-display-more-detailed-stack-trace.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/04-show-full-backtrace-on-stack-overflow.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/05-fix-missing-c-return-event.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/06-backport-006e66b6680f60adfb434ee7397f0dbc77de7873.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/07-funny-falcon-stc-density.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/08-funny-falcon-stc-pool-allocation.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/09-aman-opt-aset-aref-str.patch -p https://raw.github.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/10-funny-falcon-method-cache.patch --rubies-dir /opt/rubies  ruby 2.1.2
  • 版本:2.1.2
  • 目录:/opt/rubies
  • 使用 railsexpress 的 patch 集

备份现有的 Ruby 版本

sudo mv /usr/local/bin/erb /usr/local/bin/erb19
sudo mv /usr/local/bin/gem /usr/local/bin/gem19
sudo mv /usr/local/bin/irb /usr/local/bin/irb19
sudo mv /usr/local/bin/rake /usr/local/bin/rake19
sudo mv /usr/local/bin/rdoc /usr/local/bin/rdoc19
sudo mv /usr/local/bin/ri /usr/local/bin/ri19
sudo mv /usr/local/bin/ruby /usr/local/bin/ruby19
sudo mv /usr/local/bin/testrb /usr/local/bin/testrb19
sudo mv /usr/local/bin/bundle /usr/local/bin/bundle19

为新 Ruby 创建符号链接

sudo ln -sf /opt/rubies/ruby-2.1.2/bin/erb /usr/local/bin/erb 
sudo ln -sf /opt/rubies/ruby-2.1.2/bin/gem /usr/local/bin/gem 
sudo ln -sf /opt/rubies/ruby-2.1.2/bin/irb /usr/local/bin/irb 
sudo ln -sf /opt/rubies/ruby-2.1.2/bin/rake /usr/local/bin/rake 
sudo ln -sf /opt/rubies/ruby-2.1.2/bin/rdoc /usr/local/bin/rdoc 
sudo ln -sf /opt/rubies/ruby-2.1.2/bin/ri /usr/local/bin/ri 
sudo ln -sf /opt/rubies/ruby-2.1.2/bin/ruby /usr/local/bin/ruby 
sudo ln -sf /opt/rubies/ruby-2.1.2/bin/testrb /usr/local/bin/testrb 
sudo ln -sf /opt/rubies/ruby-2.1.2/bin/bundle /usr/local/bin/bundle

Install chruby

如果你没有在服务器上切换 Ruby 版本的需要,根本不用安装 chruby.

wget -O chruby-0.3.8.tar.gz https://github.com/postmodern/chruby/archive/v0.3.8.tar.gz
tar -xzvf chruby-0.3.8.tar.gz
cd chruby-0.3.8/
sudo make install

Default Ruby

只需要在 ~/.bash_profile 里加一句:

source /usr/local/share/chruby/chruby.sh
chruby ruby-2.1.2

我一直都在服务器上用 rbenv 的,感觉还行,不是太麻烦。

rvm 就是坑多啊,原来用过几个月,太折腾。

rbenv 挺好用的,ruby-install + chruby 感觉麻烦了点,有什么突出优势吗?

的确是感觉麻烦,如果拿 rbenv 来比较,大家觉得在服务器用 rbenv 的话,坑多么?

很早就是这么干了,ruby-install + chruby 不管是本地环境还是服务器都很不错。

rvm 什么坑,我一直都是在 debian 上用 rvm

用 Docker 吧,这样可以保证部署就是一次 docker run,

#2 楼 @hadi #3 楼 @lgn21st

chruby 不需要 rehash

#5 楼 @jimrokliu 和 capistrino postfix cron 集成的时候都需要额外的设置呀 当然,这些问题都可以解决,但本质上你解决的问题是由 RVM 创造出来的..

#9 楼 @hooopo 确实,不过找了一下文档都解决掉了。

所有的服务器都是 rvm,没踩过很严重的坑

我用 rvm 也没踩过什么坑。下次想试试 PPA http://brightbox.com/docs/ruby/ubuntu/

一直在服务器上 centos 上用 rvm,表示没有任何问题

我们 Ops 不同意在服务器上出现编译代码,所以我们永远只用官方的 Ubuntu 包

不觉得有什么坑啊。。。。从接触到现在一直再用 rvm

一直用 rvm,没碰到什么坑。

在服务器上用了 N 年 RVM 了,没发现什么问题,优点:

  1. 安装方便,一个裸系统,执行一个命令就搞定了,包括安装编译相关的包也一并搞定
  2. 升级 ruby 版本或者回滚也很方便,一个命令搞定,而且旧有的 gem 还可以直接迁移
  3. 打补丁方便,也是一个命令搞定,集成了常用的补丁

唯一缺点: cron / upstart 等运行 ruby 相关脚本时,需要在脚本添加 source rvm 的 enviroment 文件: source /home/xxx/.rvm/environments/ruby-xxx 或者用 wrappers 执行,包括升级版本以后,也要修改这个脚本的 xxx 匹配到最新版本,不过话说回来,就执行一下 sed 搞定的事情,也没有太麻烦,和优点相比,完全可以忽略

#19 楼 @quakewang 我们也一直在服务器(CentOS)上用 RVM,很方便,几乎没有遇到什么问题。 不过老版本的 RVM 在开发环境(Mac)上安装 ruby 遇到过一些问题,但并不是 RVM 的问题,而是 xcode 和 C 编译器的问题。

#7 楼 @hooopo 不需要在服务器上做 rehash,项目里用到的可执行文件,最好都binstubs(power by bundler)出来,这样在哪调用都可以正确地引用到对应的 Gemfile。

#15 楼 @iBachue 解决方法有 2, 第一种是自己编译对应平台的包 (deb, rpm) 上传内部源安装。第二种是自己打 tar 包上传服务器,像 这篇文章

rbenv 还有个好处是可以通过项目根目录的 .ruby-version 文件指定 ruby 版本号

喜欢服务器上面用 rbenv 的另一个原因是 rbenv 的一个 plugin 叫做 rbenv-vars.

version 那么多,你们不烦么

#26 楼 @hooopo 看 RVM 文档: http://rvm.io/integration/cron 如果你懒的看文档,遇到问题了,google 一下就有了,我并不觉得这是坑

#26 楼 @hooopo 看 RVM 文档: http://rvm.io/integration/cron 如果你懒的看文档,遇到问题了,google 一下就有了,我并不觉得这是坑

#28 楼 @quakewang #26 楼 @hooopo Cron RVM 就是坑,是有方法可以弄过,只是老碰上

#13 楼 @Rei PPA 这里就是调用了 update-alternatives。像@hooopo 那个备分链接,创建链接在 Ubuntu 的步骤也可以用 update-alternatives 来替换。PPA 这个东西,好像是没法具体指定到细版本。

服务器上也是用 rbenv 的,因为部署用的是 Capistrano,也都有对应的 gem 支持,加上 Bundle 的 binstubs,也不需要 rehash,很是顺手。

本论坛发帖问 rvm 的问题远比其他方式安装环境来得多,

追伸: 如果有人问:我在 win 下出现了 abc 这个问题该怎么办,各种人都回帖说换操作系统;而在 rvm 方面遇到问题,却让他自己 google 去解决,同样都是遇到问题一个绕着走一个却迎头而上,这又是一个新困扰:遇到问题时,什么时候绕着走,什么时候迎头而上

#32 楼 @ywjno 绕着走是因为那边是死路……

#33 楼 @nightire 那 ruby 源码里面自带 win32ole 这玩意如何解释

#34 楼 @ywjno 走死路通常都不是因为 Ruby 自己,而是那些需要 C extensions 的 gem——听大家这么说的。

那通过 google 找哪些是 C extensions 的 gem,然后把这些 gem 替换成纯 ruby 写的话,是不是就不是死路了?

『遇到问题了,google 一下就有了,我并不觉得这是坑』 by 楼上某位兄弟留言

来,给大家讲个笑话:

老张新买了一个风扇,吹起来非常爽,老张很高兴。

过了不久,老张发现风扇和电视同时开两个都不工作了。

邻居老李说,你要看说明书呀,你要把电视这样这样搞一下两个都好用了!

老张照做,果然成功了,老张非常感谢老李。

又过了不久,老张发现风扇和冰箱同时开两个都不工作了。

老张这次没有上次慌张,找来老李,老李已然很熟了,“你要按照说明书第 xxx 条做,把冰箱这样搞一下两个就都好用了!”

老张照做,果然成功了,老张非常感谢老李,自己又学会了一招儿。

老张问老李,“你怎么知道这么多?”

老李神秘的笑了:“这是生活常识呀!”

#23 楼 @ruohanc 都有吧,Gemfile 就可以呀

#21 楼 @_kaichen 嗯, --deployment 之后默认是 binstubs 的

一直 rvm 中用着,还比较顺利。服务器用用户级别的 rvm,crontab 不用,直接 ruby 定时脚本+god。 和系统交互少,所以目前用着顺利。

原来用 rvm 现在用 rbenv 打算以后试试这个 chruby 感觉这个被 @hooopo 称为“后现代”方式的东西听起来看起来都比较酷。

RVM 的坑还少吗?做过运维的童鞋都有体会啊。

rvm 有坑没坑,都是基于自己的场景得出的。就我的情况,楼主列出的问题我都处理过了或者不需要处理,例如不使用 postfix,而用 mailgun。为什么为了一个我不需要处理的问题,而更换现在稳定的组件呢?

我觉得 @Rei 说的对,坑不坑看自己的场景,而且是个软件都会有坑,markdown 不能加字体颜色,也不能所见既所得,学习成本增加也是必然的事情,不知道这算不算坑?但是对我们它够用了,而且还不错。话说回来,也没有个富文本编辑器,做到足够好大家都只用这一个。多样性的存在是个必然的事实。有坑也是正常的事情,成功跨过这些坑,是一个程序员成长的必然过程。即使不是 RVM,也可能是其它的。

多一种选择也不错。其实 RVM 第一次使用时手动安装依赖的库还是遇到了问题,后来用 rvm autolibs enable 让它自己来解决依赖就容易多了,基本每次可以很顺利的完成 Ruby 和 Rails 的安装。

47 楼 已删除

就对于开发者而言 rvm 对于新手和很多环境都是非常友好的,也许占空间略大一点。rbenv 用起来还不错,有些工具还跟不上,比如 rubymine。

服务器端,其实搞那么复杂干嘛,直接 ruby compile 上了。

不错,可以多学习一种解决问题的方法。其实这过程和 source 编译有点相似,只是更加方便和简化吧?比较明显的优点是迁移方便,还有是 env 的问题。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号