Windows7にRubyInstaller+Pikで複数バージョンのRuby環境を整える

Windows上で複数バージョンのRubyを使う必要に迫られたので、RubyInstallerとPikを使って実現してみた。

前置き

PikとはWindows上で複数バージョンのRubyを管理するためのツールである。

Pik - Github

このPikを使ってRubyのインストールからバージョンの切り替えまで一切を管理する…のが本来の使い方なのだろうが、Pikの開発とメンテナンスは数年前から停滞している模様で、最新版(0.3.0-pre)でもインストールできるRubyのバージョンが標準で1.9.2までだったり、各種コマンドの挙動が不安定だったりしたので、RubyのインストールはRubyInstallerで行い、Pikはあくまでもバージョン切り替えだけを目的として使うことにした。

Rubyのインストール

という訳で、まずはRubyInstallerでRubyをインストールする。

Downloads - RubyInstaller for Windows

上記のページから、このエントリー作成時点での最新バージョンであった2.0.0-p481(x86)のインストーラーをダウンロードし、ダウンロードが完了したら実行する。
ウィザードが起動し、インストーラーでの表示言語選択が出てくるので、日本語を選択してOKをクリックする。

f:id:heroween:20140630122036p:plain

ライセンスに同意して次へをクリックする。

f:id:heroween:20140630122509p:plain

インストールフォルダ(デフォルトはC:¥Ruby200-x64)と各オプションを設定し、インストールをクリックする。
今回の例では、RubyGUIアプリを作成するために必要なTd/Tkサポートが不要だったのでチェックを外した。

f:id:heroween:20140630122933p:plain

インストールが開始され、

f:id:heroween:20140630123058p:plain

インストールが完了。完了をクリックしてウィザードを閉じる。

f:id:heroween:20140630123208p:plain

コマンドプロンプトRubyのバージョンを確認してみる。

C:¥>ruby -v
ruby 2.0.0p481 (2014-05-08) [x64-mingw32]

Rubyのバージョンが表示され、無事インストールされていることが分かる。

DevKitのインストール

Rubyはインストールしたが、これだけではRubyGemsの拡張ライプラリ(C言語製の)をビルドすることができない。
この状態でjson等の拡張ライブラリをインストールしようとすると、以下のようなエラーメッセージが出力されることになるだろう。

Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

拡張ライブラリをビルドできるようにするためには、Rubyの本体に加えてDevKitもインストールする必要がある。
RubyInstallerのダウンロードページの下部にある、DEVELOPMENT KITからRuby2.0(x64)版をダウンロードして実行する。
ファイルは7zip形式のアーカイブなので、展開先を設定してExtractをクリック。

f:id:heroween:20140630125355p:plain

解凍が始まり、

f:id:heroween:20140630125404p:plain

ファイルの展開が完了するとウィザードは自動で閉じる。

インストールされたDevKitの中身を確認してみると、DevKitとはMinGWMSYSであることが分かる。
拡張ライブラリをビルドするのに最低限必要となるWindows移植版のGNUツール群であり、RubyGemsのコマンドを実行した時に、DevKitのツール群を利用するように設定してやることで、拡張ライブラリがビルドできるようになる。

で、その設定方法だが、インストールしたフォルダの直下にあるdk.rbを使って行う。
まず、コマンドプロンプトを開いて初期化コマンドであるdk.rb initを実行する。

C:¥devkit>ruby dk.rb init
[INFO] found RubyInstaller v2.0.0 at C:/Ruby200-x64

Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.

すると、このマシンにインストールされているRubyが自動で検出され、DevKitのフォルダに以下の内容のconfig.ymlというファイルが生成される。

# This configuration file contains the absolute path locations of all
# installed Rubies to be enhanced to work with the DevKit. This config
# file is generated by the 'ruby dk.rb init' step and may be modified
# before running the 'ruby dk.rb install' step. To include any installed
# Rubies that were not automagically discovered, simply add a line below
# the triple hyphens with the absolute path to the Ruby root directory.
#
# Example:
#
# ---
# - C:/ruby19trunk
# - C:/ruby192dev
#
---
- C:/Ruby200-x64

注意すべき点として、複数バージョンのRubyがインストールされている場合は、config.ymlのコメントに例示されているように、複数のパスが検出されてファイルに記載される。
この状態で、次のDevKitの適用コマンドを実行すると、全てのRubyに対して適用されてしまうため、適用したくないバージョンが含まれている場合は、テキストエディタでconfig.ymlを開き、対象外のパスを削除しておく必要がある。
尚、既に他のDevKitが適用されているRubyには、その旨がメッセージとして出力されるだけで、上書きされるようなことは無い。
逆に言うと、一度適用してしまうと修正できなくなるということなのだが、その場合はdk.rb install -fとforceオプションを付与することで強制上書きすることができる。

ここで、config.ymlの内容に問題が無ければ、dk.rb installで対象となるRubyにDevKitを適用する。

C:¥devkit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Ruby200-x64'
[INFO] Installing 'C:/Ruby200-x64/lib/ruby/site_ruby/devkit.rb'

出力されたメッセージにもある通り、適用するとdevkit.rbというファイルが新規に生成される。devkit.rbはRubyGemsのフックスクリプトで、DevKitのバイナリパスと環境変数が定義されており、RubyGemsのコマンドが実行されるとこのスクリプトが読み込まれ、拡張ライブラリのビルドにDevKit内のgcc等が使われるようになる。

余談だが、1.9.3のDevKitではdevkit.rbに加え、operating_system.rbというファイルも生成される。operating_system.rbは元からRubyの本体にあるファイルなのだが、その内容が書き変わり、元のファイルは日時付きにリネームされて、バックアップファイルとして保持される。
尚、devkit.rbとoprating_system.rbの内容は概ね同じなのだが、operating_system.rbがRubyGemsのフックスクリプトで、devkit.rbはプログラム内でDevKitの設定をrequire 'devkit'して読み込む為のヘルパーライブラリという位置付けであった。2.0になってからはdevkit.rbに統合された模様である。
DevKitについてより詳しく知りたければGithubのWikiを参照すると良い。

これでDevKitのインストールは完了となり、Ruby2.0.0の実行環境が整った。
そうしたら、次は同様の手順で別のバージョンのRubyである1.9.3-p545をインストールしてみよう。
DevKitも1.9.3向けのものがあるので、そちらも合わせてインストールする。

DevKitのアンインストール

DevKitはRubyやPikと異なり、アンインストールするためのプログラムは用意されていないので、アンインストール方法についても触れておく。
DevKitをアンインストールをしたくなったら、インストールフォルダを丸ごと削除し、適用したRubyに生成されたdevkit.rbを削除する。
1.9.3の場合はこれに加えて、operating_system.rbをバックアップされている初期のファイルに差し替える必要がある。

Pikのインストール

さて、これで2つのバージョンのRubyがインストールできた。それでは、これらのRubyをPikで管理できるようにする。
PikはRubyGemsインストーラーを使ってインストールすることができるのだが、特定のバージョンのRubyに依存する形でインストールしたくなかったので、今回はインストーラーの方を使った。

pik - Download Packages

上記のページから最新版であるpik-0.3.0.pre.msiをダウンロードし、インストーラーを実行するとウィザードが起動するのでNextをクリックする。

f:id:heroween:20140701102104p:plain

ライセンスに同意し、

f:id:heroween:20140701102235p:plain

インストールフォルダ(デフォルトはC:¥pik)の設定とシステムパスへPikのバリナリパスを通すかをチェックし、

f:id:heroween:20140701102359p:plain

Installをクリック。

f:id:heroween:20140701102548p:plain

f:id:heroween:20140701102556p:plain

インストールが完了したらFinishをクリックでウィザードを閉じる。

f:id:heroween:20140701102627p:plain

コマンドプロンプトを開き以下のコマンドでバージョンを確認。

C:¥Users¥heroween>pik -v
pik 0.3.0.pre on Microsoft Windows [Version 6.1.7601]
by Gordon Thiesfeld (gthiesfeld@gmail.com)

creating C:¥Users¥heroween¥.pik

問題無くインストールできた。
コマンドの初回実行時には、ユーザーのホームフォルダ配下に.pikフォルダが生成される。
このフォルダは初め空の状態だが、Pikを使用することで設定ファイルが格納されることになる。

注意すべき点として、Pikをインストーラーでインストールした場合は、ユーザー環境変数HOME(もしくはPIK_HOME)に%USERPROFILE%を設定しておく必要がある。
このユーザー環境変数を設定しておかないと、Pikを使ってRubyのバージョンを切り替えることができないので、コマンドプロンプトなり、コントロールパネルのシステムから設定しておこう。

Pikで複数バージョンのRubyを使う

ユーザー環境変数の設定まで終えたら、Pikで複数バージョンのRubyを使ってみよう。
まずは、インストール済みのRubyをPikに登録していく。
pik listを実行してPikにRubyが未登録であることを確認。

C:¥Users¥heroween>pik list

pik addに引数としてRubyのバイナリパスを渡して、各バージョンを登録していく。

C:¥Users¥heroween>pik add C:¥Ruby200-x64¥bin
INFO: Adding:  [ruby-]2.0.0-p481
      Located at:  C:¥Ruby200-x64¥bin

C:¥Users¥heroween>pik add C:¥Ruby193¥bin
INFO: Adding:  [ruby-]1.9.3-p545
      Located at:  C:¥Ruby193¥bin

完了したらもう一度pik listを実行。

C:¥Users¥heroween>pik list
   ruby-1.9.3-p545
=> ruby-2.0.0-p481

C:¥Users¥heroween>ruby -v
ruby 2.0.0p481 (2014-05-08) [x64-mingw32]

Rubyが登録されていることが確認できる。
先頭に⇒が記されているRubyが現在有効になっているバージョンである。
ここで、.pikフォルダの中を確認してみると、以下のような内容のconfig.ymlというファイルが生成されている。

---
"[ruby-]1.9.3-p545":
  :path: !ruby/object:Pathname
    path: C:/Ruby193/bin
  :version: |
    ruby 1.9.3p545 (2014-02-24) [i386-mingw32]

"[ruby-]2.0.0-p481":
  :path: !ruby/object:Pathname
    path: C:/Ruby200-x64/bin
  :version: |
    ruby 2.0.0p481 (2014-05-08) [x64-mingw32]

--- {}

初回のpik addでこのconfig.ymlが生成され、登録したRubyの情報がここに定義されるという訳である。

次に、バージョンを切り替えてみよう。
登録されているRubyのバージョンを切り替えるにはpik useを使う。
pik useに渡す引数は、ruby-1.9.3-p545といったフルネームでも、1.9.3-p545といった省略形でもどちらでも良い。

C:¥Users¥heroween>pik use 1.9.3-p545

C:¥Users¥heroween>pik list
=> ruby-1.9.3-p545
   ruby-2.0.0-p481

C:¥Users¥heroween>ruby -v
ruby 1.9.3p545 (2014-02-24) [i386-mingw32]

これでバージョンが2.0.0-p481から1.9.3-p545へと切り替わった。

以上で、Windows上に複数バージョンのRuby環境が整い、Pikで切り替えながら使うことができるようになった。
さらに他のバージョンのRubyも使いたければ、これまでの手順通りにRubyをインストールしてPikに登録してやれば、同様に使い分けることができる。

Pikについて蛇足

最後にPikを使ってみての所感。
冒頭にも書いた通り、開発とメンテナンスが停滞してるためか、色々とコマンドの挙動が不安定だった。

例えば、

  • 登録したRubyのバージョンを削除するpik remove(rm)は、実行すると一見正常に動いているように見えるが実は機能していない。不要なRubyのバージョンを削除したければ、直接config.ymlをテキストエディタで編集した方が良い。
  • config.ymlを削除するpik implodeは、実行時にエラーを出力するけどconfig.ymlは削除されている。
  • Pikのバージョンアップをするpik update(up)は、0.3.0-preで実行すると0.2.8にダウングレードされ(安定版だからだろうが)、かつその時点で使っているRubyのgemにインストールされる。さらにpik list -rで表示される殆どのRubyのバージョンが消えてしまう。

等々。
他にも、pik install等のパッケージ周りのコマンドも、なんだかんだと前提条件が必要だったりで、単純に実行しただけではすんなりと動かないケースが多い。
興味があればGithubを参照しながらアレコレ試してみると良いが、きっと煩わしくなることが多いだろう。
インストール自体は楽だし、バージョンの切り替えだけに限定すれば特に問題は無いので、割り切って使うのが賢明かと思う。