部署 Install Ruby The "Postmodern" Way

hooopo for Shopper+ · July 09, 2014 · Last by imlcl replied at August 02, 2014 · 10788 hits
Topic has been selected as the excellent topic by the admin.

上次发了一个帖子『别在服务器上装 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,没踩过很严重的坑

#11 楼 一样

我用 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 Floor has deleted

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

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

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

52 Floor has deleted
53 Floor has deleted
You need to Sign in before reply, if you don't have an account, please Sign up first.