OS や、動かしたいアプリケーションに依りますが、ruby の実行環境の構築は大変です。
というのも、ruby 本体、rubygems、各 gem などのバージョン指定が交錯していて、ruby の ecosystem に慣れていない人にとっては、なにがなんだかわからないからです。
こっちのツールを動かそうとすると、こっちが動かなくなる、みたいなことになります。
rubyists は、バージョンの問題を吸収するためのツールを使ってこの問題に対処していますが、ruby に詳しくなくて、ただ ruby 製のツール(たとえば Redmine)を使おうとしている人は分からないでしょう。
そういう人が ruby に挫折しないように、事実無根な中傷をしないように、最近流行のツールで、バージョンミスマッチの問題をおこさない方法を説明します。
この説明が対象としているのは UNIX,LINUX 系の環境だけです。mac と linux の各ディストリでは動くはずですが、win では動かないかもしれません。
mac では、OS に乗っているバージョン管理システムが賢こかったりして、よりよい方法があるかもしれません。
対象としているのは、ruby をほとんど知らない人です。Ruby を知っている人にとっては、ものたりない説明になるでしょう。
用語やツールの紹介にとどめているので、各自で分からないところは検索してください。
また、正確性よりもわかりやすさを重視しています。各ツールの使い方は複数あって、これ以外の使い方もあります。
個人的にいじってみる目的の環境を構築する方法を主眼としています。ルート権限がなくても試せる一方、サーバ運用には不十分な部分があるかもしれません。
メニュー
- 特定用途で ruby を使いたいときは
- RVM
- bundler
- どうしても動かない時のために
特定用途で ruby を使いたいときは
サーバ用途で使いたいときは、よりよい方法があるかもしれません。
Redmine
Redmine はかなり特殊な(古い)環境を要求するので、そのための環境を作ったほうがいいかもしれません。
もし VPS がひとつあって、そこで Redmine だけ動けばいいや、なら、次の説明が参考になります。
さくらのVPS を使いはじめる 7 – Ruby EE、Passenger、Redmine | アカベコマイリ
Lokka、その他の Ruby/Rails 製ウェブアプリ
Lokka でブログをやりたいなら、heroku を使いましょう。
Heroku | Cloud Application Platform
自分で環境構築するより楽だし、安定します。
ドメインも好きなものを使えます。
Getting Started - Lokka
他のウェブアプリでも、heroku で動作させる方法がのっているかもしれません。
有名なアプリなら、「アプリ名 heroku」検索すればでてくるでしょう。
なにがしかのツール
コード変換とかのスクリプトが Ruby で書かれているのもよく目にします。
この場合は以下の方法に従ってください。
RVM
RVM Ruby Version Manager - RVM Ruby Version Manager - Documentation
Ruby Version Manager (RVM)は、複数バージョンの ruby を同居させる方法の一つです。
rvm を利用して、1.8系と1.9系をシェル単位できりかえて使うことができます。
rvm install rubyのバージョン でインストールしたら、rvm use rubyのバージョン でそのバージョンを使用します。
install はコンパイルするため、かなり時間がかかるので、覚悟しておいてください。
rvm 入門 … 複数バージョンの Ruby と Rails を混在させる - まちゅダイアリー(2011-05-21)
rvm 複数のRubyを共存させる最新のやり方 - 床のトルストイ、ゲイとするとのこと
gemset
rubygems はパッケージマネージャにあたり、gem というコマンドを提供してます。
しかし、調子にのって必要な gem をがんがん入れていくと、別の gem との間で必要としているバージョンが食い違う、なんてことがあります。
これを避ける方法はいくつかあって、一つはそれぞれのアプリケーションのディレクトリに、そのアプリケーションが必要とする gem を入れる方法です。
これには、一般的に bundler という、後で紹介するツールを使います。この、bundler のほうが問題やミスが起きにくいので私は好きです。
もうひとつは食い違わないように、特定のアプリケーションを動かす時には、特定の gem の組み合わせ、gemset を使うという方法です。
gemset は複数用意できるので、動かしたいアプリケーションに応じて gemset を切り替えられます。
この gemset というのも、rvm が提供している機能です。
padrino は関連してたくさんの gem を必要とするので、このための gemset を作ってみましょう。
$ rvm gemset create padrino # 作成 $ rvm gemset use padrino # 切り替え $ rvm gemset list # 一覧表示 gemsets for ruby-1.9.2-p180 # gemset は ruby のバージョン毎にわかれる global lokka mikutter => padrino # 使用中 $ gem install padrino # 必要な gem を入れる
global というのは特殊な gemset で、どの gemset を使用していても、このなかの gem を使うことができます。
heroku や pry など、個人的につかいたい、他のアプリケーションが使用しないツール・コマンドをいれておくと便利です。
.rvmrc
また、あるディレクトリにいったら、かならずこの gemset を使いたいときがあります。たとえば padrino で作ったアプリがまとめて入っているディレクトリとか。
その場合は、そのディレクトリに .rvmrc というファイルを作成し、
rvm gemset use padrino
と書いておくと、ここに書いたシェルスクリプトがディレクトリ切り替え時に実行されるので、いつも padrino gemset を使えます。
.rvmrc は環境変数の設定などに使っても OK で、とても便利です。
Bundler
Bundler The best way to manage Ruby applications
gem管理の新標準ツール"Bundler"のTips - 床のトルストイ、ゲイとするとのこと
使おうとおもっているアプリのディレクトリに、Gemfile という名前のファイルがあれば、bundler を使ってラクできます。
まずは、
$ gem install bundler
で bundle コマンドを使えるようにします。
この時は、gemset とか考えずに gem install しちゃって大丈夫です。たまに bundler のバージョンを指定しているアプリケーションがありますが、その時にあらためて gemset を作りましょう。
次に、アプリケーションのディレクトリで、
$ bundle install --path .bundle/gems
とします。.bundle/gems の部分は、どこに gem を置いてほしいかの相対パスです。vendorなどにする場合もあります。好みと習慣の問題です。
--path を付けないと、ふつうに gem install したのとおなじように、グローバルなところに入ります。用途によって使い分けましょう。
bundler を使ってインストールした gem が必要な時は、bundle exec というのをつけて実行する必要があります。
$ bundle exec rackup $ bundle exec rake spec
bundler を使っているときに、「gem が入ってないよ!」とか「gem のバージョンがおかしいよ!」とかでたら、bundle execが付いているか確認しましょう。
bundler には、--without というオプションがあり、テスト用の gem などはインストールしない、という指定ができます。
くわしくは Bundler The best way to manage Ruby applications と、各プロジェクトの説明、Gemfile を見てください。
bundler 自体のバージョンがおかしいとき
プロジェクトが bundler のバージョンを指定しているのに、自分が使っているのが新しすぎる場合があります。
gemset を変えて、bundler をバージョン指定してインストールすることで回避できます。
$ rvm gemset create annoyingapp $ rvm gemset use annoyingapp $ gem install bundler --version "= 0.0.0" $ bundle install --path .bundle/gems
どうしても動かない時のために
要求バージョンの書き換え
Gemfile と Gemfile.lock には、要求バージョンが書いてあります。
これを書き換えることで、インストールは通るので、動く場合もありますが、意味不明なエラーをひきおこす場合もあります。
あまりおすすめしませんが、やるなら次の手順を踏みましょう。
.bundleディレクトリを消す- Gemfile.lock も消す
- Gemfile のバージョン指定を消す
bundle installする(Gemfile.lockと.bundleディレクトリが再生成される)
仮想環境
VMWare とかをいれて仮想環境を立てて、使いたいバージョンをビルドして…とやれば必ず使えます。
私がこれをやるのは、nginx とか、ruby 以外の部分で問題がおきて、それを再現したいときです。
人に聞く
twitter(@tomy_kaira)かコメントで聞いていただいても結構です。