部署 Install Ruby The "Postmodern" Way

hooopo for Shopper+ · 发布于 2014年07月09日 · 最后由 imlcl 回复于 2014年08月02日 · 7947 次阅读
8
本帖已被设为精华帖!

上次发了一个帖子『别在服务器上装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
共收到 48 条回复
96

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

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

96

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

3

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

20

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

96

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

202

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

8

#2楼 @hadi #3楼 @lgn21st

chruby不需要rehash

8

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

96

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

713

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

449

#11楼 一样

1

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

14006

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

172

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

11562

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

A87c18

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

162

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

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

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

332

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

178

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

96

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

96

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

96

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

96

version那么多,你们不烦么

162

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

162

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

De6df3

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

96

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

96

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

1342

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

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

1573

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

1342

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

1573

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

1342

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

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

8

来,给大家讲个笑话:

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

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

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

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

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

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

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

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

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

8

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

8

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

2511

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

611054

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

2145

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

1

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

96

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

2945

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

47楼 已删除
177

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

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

4584

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

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