0

新しいMacbook Airを買ったのでRuby2.0.0-p195をrbenvでインストールした

最近Ruby入れるの苦しい。
Macには1.8.7入ってて最近のgemビルドできないし、rbenvからのインストールが苦しすぎて学部向けの授業教材でRuby使えなくてJavaScriptでやってます。


インストール

brew install 2.0.0-p195

ビルドできたと思ったらエラーでた
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?

エラーでぐぐったら解決法発見
homebrew – OpenSSL error installing ruby 2.0.0-p195 on Mac with rbenv – Stack Overflow

opensslのディレクトリを指定してインストール
CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p195
成功!

いつもどおりrbenvでruby2.0.0が使えるようになった。


digestを使うといつものエラーがでた
/Users/sho/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/digest.rb:12:in `const_missing': library not found for class Digest::SHA1 -- digest/sha1 (LoadError)

いつもどおりruby1.9.2を入れて、digest以下をコピーしてくる
cp ~/.rbenv/versions/1.9.2-p320/lib/ruby/1.9.1/x86_64-darwin12.3.0/digest/* ~/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/x86_64-darwin12.3.0/digest/


そしたら今度は違うエラーになった
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

エラーでぐぐったら解決法発見
ruby on rails – SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed – Stack Overflow


brew install curl-ca-bundle

SSL証明書への参照をshellの設定に書いた
export SSL_CERT_FILE=/usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt


これで全部動くようになった。

と思ったがrb-appscriptが動かない。

0

Raspberry PiにrbenvでRuby2.0.0インストールした

aptのrbenvが0.3.0と古かったので

Ubuntu12.04にrbenvインストールして、crontabやdaemontoolsも設定した

と同じ手順で0.4.0をgitから入れた。
けどビルドに2時間以上かかったので、aptで1.9.3-p194を入れればいいと思う。


crontabや、foremanで書きだしたupstartも

/home/pi/.rbenv/shims/bundle exec ruby hogehoge.rb
で起動したら問題なく動いた。

0

MacにRuby2.0.0-p195インストールした

ruby-buildにp195が来ていたので入れた。

brew update
brew info ruby-build
brew unlink ruby-build
brew install ruby-build
rbenv install --list | grep 2.0.0
rbenv install 2.0.0-p195

rbenv global 2.0.0-p195
rbenv rehash
gem update --system
rbenv rehash
gem install bundler rbenv-rehash
rbenv rehash


あいかわらずssl関係を使うとエラーが出るので
/Users/sho/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/digest.rb:12:in `const_missing': library not found for class Digest::SHA1 -- digest/sha1 (LoadError)


いつも通り1.9.2のバイナリをコピーしてきたら治った。
cp ~/.rbenv/versions/1.9.2-p320/lib/ruby/1.9.1/x86_64-darwin12.3.0/digest/* ~/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/x86_64-darwin12.3.0/digest/

0

Ubuntu12.04にrbenvインストールして、crontabやdaemontoolsも設定した

さくらVPSのUbuntu12.04のrvmをrbenvに切り替えた

関連

mac版
橋本商会 » rvmからrbenvに乗り換えた
橋本商会 » crontabでrbenvのrubyを使う

準備


先にrubyをbuildするのに必要なaptを入れる(先にrvmを使っていたのでこれは必要なかったが)
sudo apt-get install build-essential libreadline-dev libssl-dev


rvmを消す
rvm seppuku
sudo rm -rf ~/.rvm


ホームディレクトリにrbenvを入れる


rbenvはaptにもあるけどruby-buildが無いので両方githubからcloneした。
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
mkdir ~/.rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build


rbenvへのパスを通す。 ~/.zshrc に書けばいい・・
export PATH=$PATH:$HOME/.rbenv/bin
eval "$(rbenv init -)"
と思いきや、screenを起動したりzsh上でzshを起動するとrbenvのパスより上に /usr/local/bin 等が来て、system rubyが使われてしまう現象が起きた。

rbenvのissueやドキュメントを確認したり調べてみると
Unix shell initialization · sstephenson/rbenv Wiki
インストールしたてのUbuntu12.04では /etc/zsh/zshrc や /etc/zlogin がPATHをいじってた。
一番最後にロードされるらしい ~/.zlogin にrbenvの設定を書いたらscreen上でもrbenvが正しくロードされた。


ruby 2.0.0インストール
rbenv -v
rbenv install --list | grep 2.0
rbenv install 2.0.0-p0


デフォルトでruby2.0使うようにする。
rbenv global 2.0.0-p0
rbenv rehash
ruby -v
2.0になってればok


gemをアップデートしたり、自動rehashするrbenv-rehashを入れたり
gem update --system
rbenv rehash
gem install rbenv-rehash bundler
rbenv rehash


jrubyもインストールする
rbenv install jruby-1.7.3


jrubyのソースコード置いてある場所でだけ、ruby2.0からjruby1.7に切り替えるようにする
cd ~/src/jruby
rbenv local jruby-1.7.3
rbenv rehash
ruby -v
jrubyになっていればおk


rubygemとbundlerをアップデートしたり、自動的にrehashするようにする。
gem update --system
rbenv rehash
gem install rbenv-rehash bundler
rbenv rehash
このディレクトリの下でだけjrubyが使われるようになる。


crontabでrbenvのrubyを使う


crontabの上の方で、PATHの先頭に ~/.rbenv/shims を入れる。
あとはアプリのディレクトリまでcdしてからrubyを使うようにすれば、ちゃんとGemfileも.ruby-vesionも読んで実行してくれる。
HOME=/home/shokai
PATH=/home/shokai/.rbenv/shims:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/shokai/bin

*/15 * * * * cd $HOME/src/ruby/twitter-change-profile && ruby change-profile.rb
*/20 * * * * cd $HOME/src/jruby/glitchicon && ruby bin/create_icon.rb $HOME/shokai.png /var/tmp/glitch_icon.png && ruby bin/upload.rb /var/tmp/glitch_icon.png
jruby使うアプリもちゃんとrbenv切り替えて実行してくれてた。


事前にcrontab上でrbenvが正しく動くかを確かめたほうがいい。
* * * * * echo $PATH > $HOME/cron-path.txt
* * * * * ruby -v > $HOME/cron-ruby-version.txt
* * * * * cd $HOME/src/jruby && ruby -v > $HOME/cron-jruby-version.txt
こういうの登録したらホームディレクトリに環境変数とか書き出す。
なんだか知らんが、Macではできるのに、PATHへの代入の右項に$HOMEとか書いても変数展開されない現象が起きてた。


daemontoolsでrbenvのrubyを使う


daemontoolsはlogが確認しやすいので楽。

http://dev.shokai.org:4000 の起動スクリプト。
cronと同じようにパスの先頭にshimsを追加すればいい。

/etc/service/rocketio-chat/run
#!/bin/sh
exec 2>&1
exec setuidgid sho bash -c '
HOME=/home/shokai
PATH=$HOME/.rbenv/shims:$PATH
cd $HOME/src/sinatra/rocketio-chat-sample
WS_PORT=18080 rackup config.ru -p 4000
'

2

crontabでrbenvのrubyを使う

関連 crontabでRVMのRubyを使う

crontabの頭で環境変数PATHに ~/.rbenv/shims を入れておけばおk


うちではこんなふうになっている

SHELL=/usr/local/bin/zsh
HOME=/Users/sho
PATH=/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/$HOME/bin:$PATH
PATH=$HOME/.rbenv/shims:$PATH

## この下にcrontabが書かれている


ちゃんと切り替えれているか確認

ruby -vでバージョンがでるので、
* * * * * ruby -v > $HOME/ruby_version
と書いておけばホームディレクトリにruby_versionというファイルが毎分書き出される
これがrbenvでglobal設定したrubyになっているか確認する。
ちゃんとPATHに $HOME/.rbenv/shims が追加できていれば2.0.0とか書き込まれる。



ディレクトリ毎の確認

rbenv local 1.9.2-p320
でそのディレクトリに .ruby-version というrbenvの設定ファイルができる
これがあると、そのディレクトリに入ったらrbenvが切り替わる。


また、rbenv-rehashというgemを入れておけば自動的にrehashしてくれる。
gem install rbenv-rehash


1.9.2にだけarduino_firmata gemを入れて、ディレクトリ毎にrbenv切り替えがcrontab上でも有効なのか試す
mkdir ~/tmp/1.9.2
cd ~/tmp/1.9.2
rbenv local 1.9.2-p320 # .ruby-versionが生成される
gem install arduino_firmata
arduino_firmata -v

で、crontabに書く
* * * * * arduino_firmata -v > $HOME/arduino_version
* * * * * cd $HOME/tmp/1.9.2 && arduino_firmata -v > $HOME/tmp/1.9.2/arduino_version

ホームディレクトリではrbenvのglobaで設定されているRuby2.0.0が使われたので、arduino_firmata gemがインストールされていなくてコマンド実行失敗していた。
tmp/1.9.2にcdした方はちゃんとRuby1.9.2に切り替わっていて、gemで入れたarduino_firmataコマンドへのパスも通っていた。
tmp/1.9.2/arduino_versionには ArduinoFirmata v0.2.8 と書かれていた。


cronで使うまとめ

アプリのディレクトリ毎に
  • crontabの一番上で PATH=$HOME/.rbenv/shims:$PATH
  • アプリ毎にGemfileを作ってbundlerでgem管理
  • アプリのディレクトリに .ruby-version作って、rbenvのバージョンも合わせる
  • アプリのディレクトリにcdで移動してから実行

これで複数バージョンのRubyをcrontabで使える。