CentOS5.4へのRuby1.8.7+Rails2.3.5のインストールメモ

わざわざブログを分ける必要も無いので、技術系の話題も全てこのブログに集約させます。他のブログは全部引き上げます。僕が芸能人になったら、アメブロにも書くかもしれません。おそらく"WEB技術者出身の落語家"とかそういう特殊なジャンルのタレントになるだろうと思います。

さて表題の件、半年前に半日くらいハマってたので、こっちに転載しときます。昨今ruby1.9.2とRails3.0が最近リリースされ、話題になってるのは、まあ結構なんですが、まだまだ組み合わせの事例が少ないので、2010年現在標準と思われるRuby1.8.7+Rails2.3.5の組み合わせが安定かと思われます。

僕もrailsの学習は当時よりだいぶ進んでいますが、この環境で書かれた本がまだ多いように思われます。

CentOS使いはなぜかrpmで管理したい。

まず話の発端として、CentOS5.4にデフォで入ってるのはRuby1.8.5です。しかし1.8.5だと、Railsとの相性がアレなので、現時点での1.8系ファイナルの1.8.7へアップデートする試みです。ググってみると案外みんな1.8.5はrailsまわりで不便してるみたい。なので、1.8.7へアップデート。もちろんCentOSを使ってるからには、全部yumでやっちまいたいところですが、yumでは1.8.5が最終ときてます。というわけでrpmか、ソースからやるという事になるワケですねハイ。

で、rpmを探しまくったところ存在しないので、結局ソースからやる事になるワケです。現時点では。しかも普通にmake installするばかりではなく、なぜだか世の中のCentOS+Rubyユーザーは、わざわざrpmをソースから自作してまでして作って、あくまでrpmにして管理したい模様です。

[ruby 1.8.7 rpm]あたりでググると一杯出てきます。

追加レポジトリのインストール

RPM化するにはcheckinstallというコマンドを使い、ソースコードをわざわざrpmにして、rpmでインストール。ついでにgemも同じくcheckinstallrpmにして、rpmコマンドでインストールと、もうrpmじゃなきゃインストールしねえぞ!!みたいな勢いで、checkinstall使ってみんなrpmにしてからインストールしてる様子です。というわけで、まずはcheckinstallのインストールからはじめます。

checkinstall自体はyumで入るんですが、CentOSレポジトリにはパッケージが無いので追加のレポジトリをインストールせにゃなりません。そっからはじまる長い長い物語なのです。ま、これどおりにやれば多分入ります。

追加のレポジトリは、かの有名なRPMforgeです。これのインストールからいきます。

このへんを参考にするといいんですが、
http://moimoitei.blogspot.com/2008/08/centos-52-ruby.html

上記リンクでは、決定的に駄目な事にrpmが置いてあるurlが変わっちゃってます。正しいRPMforgeのrpmの場所はココ。

http://wiki.centos.org/AdditionalResources/Repositories/RPMForge#head-20e1f65f19ccf2f5fbf5adb30dbaf5ea963a64ae

コマンドも書いておきましょうかね。えへへ。(386の人用です。64の人は上のリンクを見て下さい。)

# rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
# rpm -ivh http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm

これでインストールされます。そして皆さん、なぜだか普通にyumった時にはRPMforgeを無効にして特別な時だけ有効にするという手を使っています。まあ、サードパーティーのレポジトリから、変なアップデートひっかけられても困っちゃうかもしんないですね。確かに。というわけで、いろいろありますが、下記のように編集して下さい。

#vi /etc/yum.repos.d/rpmforge.repo
[rpmforge]
name = Red Hat Enterprise $releasever - RPMforge.net - dag
#baseurl = http://apt.sw.be/redhat/el4/en/$basearch/dag
mirrorlist = http://apt.sw.be/redhat/el4/en/mirrors-rpmforge
#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
enabled = 0  #デフォルトでオフにする場合は0のままでOK
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1

                                                                                                                                • -
下記のように変更します。
                                                                                                                                • -
[rpmforge] name = Red Hat Enterprise $releasever - RPMforge.net - dag baseurl = http://apt.sw.be/redhat/el4/en/$basearch/dag #mirrorlist = http://apt.sw.be/redhat/el4/en/mirrors-rpmforge mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge enabled = 1 #今回はデフォルトでオンにしました。 protect = 0 gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag gpgcheck = 1

checkinstallのインスト―ル

これで、準備完了です。デフォルトRPMforgeをオフにした人は、こんなふうにインストールします。

# yum --enablerepo=rpmforge install checkinstall

私は面倒なので、enabeled = 1で、デフォルトで有効にしときましたので、

# yum install checkinstall

これだけでOKこれでcheckinstallのインストールが完了。

1.8.7のソースのダウンロード、rpm

というわけで、rubyのソースを落として来ましょう。

最新版はココにあります。現時点ではパッチ249が最新でした。
http://www.ruby-lang.org/ja/downloads/

さらに、zlibsやgcc、openSSLなんかが入ってないとmakeする時にエラる場合があるようです。詳しくは、下記を参考にして下さい。

# yum install gcc
# yum install zlib-devel
# yum install rpm-build
# yum install openssl-devel
# yum install readline-devel
# yum install nkf

というわけで、とりあえず上記を全部確認してから作業しましょう。(全部もう入ってたけど)

# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p249.tar.gz
# tar zxvf ruby-1.8.7-p249.tar.gz
# cd ruby-1.8.7-p249
# ./configure --prefix=/usr
# make

ここまでやったら、いよいよさっき準備したcheckinstallの出番です。make installとか勢いでやんないで、rpmにしてからインストールというややこしいことを皆さんしてるので、長いものには巻かれましょう。

# checkinstall --fstrans=no

checkinstall 1.6.0, Copyright 2002 Felipe Eduardo Sanchez Diaz Duran
           This software is released under the GNU GPL.


The package documentation directory ./doc-pak does not exist.
Should I create a default set of package docs?  [y]:

Preparing package documentation...OK

Please choose the packaging method you want to use.
Slackware [S], RPM [R] or Debian [D]? R


Please write a description for the package.
End your description with an empty line or EOF.
>

     RPM package creation selected    


This package will be built according to these values:

1 -  Summary: [ Package created with checkinstall 1.6.0 ]
2 -  Name:    [ ruby-1.8.7 ]
3 -  Version: [ p249 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ ruby-1.8.7-p249 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ ruby-1.8.7 ]

Enter a number to change any of them or press ENTER to continue:

Installing with make install...

========================= Installation results ===========================
./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb  ./instruby.rb --make="make" --dest-dir="" --extout=".ext" --mflags="" --make-flags="" --data-mode=0644 --prog-mode=0755 --installed-list .installed.list --mantype="doc"
installing binary commands
installing command scripts
installing library scripts
installing headers
installing manpages
installing extension objects
installing extension scripts

======================== Installation successful ==========================

Copying documentation directory...
./
./ChangeLog
./NEWS
./COPYING.ja
./README
./COPYING
./doc/
./doc/shell.rd.ja
./doc/irb/
./doc/irb/irb-tools.rd.ja
./doc/irb/irb.rd
./doc/irb/irb.rd.ja
./doc/forwardable.rd
./doc/NEWS-1.8.0
./doc/forwardable.rd.ja
./doc/shell.rd
./doc/ChangeLog-1.8.0
./README.ja
./README.EXT
./README.EXT.ja
./GPL

Some of the files created by the installation are inside the build
directory: /root/ruby-1.8.7-p249

You probably don't want them to be included in the package,
especially if they are inside your home directory.
Do you want me to list them?  [n]:
Should I exclude them from the package? (Saying yes is a good idea)  [y]:

Copying files to the temporary directory...OK

Striping ELF binaries and libraries...OK

Compressing man pages...OK

Building file list...OK

Building RPM package...OK

NOTE: The package will not be installed

Erasing temporary files...OK

Deleting doc-pak directory...OK

Writing backup package...OK

Deleting temp dir...OK



 Done. The new package has been saved to

 /usr/src/redhat/RPMS/i386/ruby-1.8.7-p249-1.i386.rpm
 You can install it in your system anytime using:

      rpm -i ruby-1.8.7-p249-1.i386.rpm

これで/usr/src/redhat/RPMS/i386/ruby-1.8.7-p249-1.i386.rpmrpmが作られた模様です。それをインストールするワケですがその前にやっておかないといけない事が。

今入ってるruby1.8.5を引っこ抜く

これをやらなかったので私は死ぬほどハマりました。っていうかやったんだけど、関連パッケージが1個残ってたみたいなのよね。一個でも残ってると駄目です。全部引っこ抜きましょう。

# rpm -qa |grep ruby

で、出てきたruby関連のものを全部引っこ抜きます。

# rpm -e 出てきたやつ

一個一個引っこ抜くのが面倒くさかったらyumで抜いてもいいです。

# yum remove ruby ruby-libs......出てきたヤツ全部

というわけで、もう一度確認

# rpm -qa |grep ruby

試しにwhichで完全に抜けてるかどうかもチェックして下さい。

#which ruby
/usr/bin/which: no ruby in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

ようやく抜けました。さらに殲滅を加えるべく、ガキンガキンに削除します。

# rm -Rf /usr/bin/ruby
# rm -Rf /usr/lib/ruby

はぁはぁ、流石にもう残ってねえだろう。というわけで次。

1.8.7のRPMのインストール

というわけで、あくまで今までの1.8.5を跡形もなく全部引っこ抜いてから、さっき作ったrpmインスコします。

rpm -ivh /usr/src/redhat/RPMS/i386/ruby-1.8.7-p249-1.i386.rpm

準備中...                ########################################### [100%]
   1:ruby-1.8.7             ########################################### [100%]

今までの苦労はなんだったんだというくらい、ちょ〜あっという間です。というわけで早速チェックしてみましょう。

# which ruby
/usr/local/bin/ruby

# ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]

オッケーですね。/usr/local/bin/以下になってんのは、こないだわざわざ自分でパス通したからです。普通は/usr/bin/rubyでしょう。

gemのインストール

ここでドはまりしましたので、書いておきます。結論として、1.8.5関連のrpmを全部引っこ抜いてから1.8.7を入れないと、gemのインストールにも成功しません。私は、一度インストールしちゃった1.8.7をアンインストールして、1.8.5の関連のrpmを全部引っこ抜いて、再度make checkinstall rpmで1.8.7をインストールという手順をふんでようやくgemがキレイに入りました。

========================= Installation results ===========================
ruby: No such file or directory -- setup.rb (LoadError)

  Installation failed. Aborting package creation.

Cleaning up...OK

こういうのとか、

RubyGems 1.3.6 installed
./lib/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- tsort (LoadError)
        from ./lib/rubygems/custom_require.rb:31:in `require'
        from ./lib/rubygems/dependency_list.rb:7
        from ./lib/rubygems/custom_require.rb:31:in `gem_original_require'
        from ./lib/rubygems/custom_require.rb:31:in `require'
        from ./lib/rubygems/uninstaller.rb:9
        from ./lib/rubygems/custom_require.rb:31:in `gem_original_require'
        from ./lib/rubygems/custom_require.rb:31:in `require'
        from ./lib/rubygems/commands/setup_command.rb:364:in `uninstall_old_gemcutter'
        from ./lib/rubygems/commands/setup_command.rb:119:in `execute'
        from ./lib/rubygems/command.rb:258:in `invoke'
        from ./lib/rubygems/command_manager.rb:134:in `process_args'
        from ./lib/rubygems/command_manager.rb:104:in `run'
        from ./lib/rubygems/gem_runner.rb:58:in `run'
        from setup.rb:35

  Installation failed. Aborting package creation.

Cleaning up...OK

こういうエラーが出ました。参考までに。


正しい手順を踏むと下記のようになります。上記のエラーはできれば見たくありません。

gemを下記からダウンロードしてきます。

http://rubyforge.org/frs/?group_id=126&release_id=42796

最新版は、1.3.6ですね。これをDL

# wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
# tar zxvf  rubygems-1.3.6.tgz
# cd rubygems-1.3.6

そんでもってCentOSユーザーの皆さんは、gemすらもcheckインストールでrpm化、さらにrpmでインストールしてるみたいです。面倒くせー。普通にインストールすりゃいいじゃんかー。でもそれも上手くいかなかったんだよね。上述の理由で。とりあえずrpm化します。

# checkinstall -R "ruby setup.rb"

checkinstall 1.6.0, Copyright 2002 Felipe Eduardo Sanchez Diaz Duran
           This software is released under the GNU GPL.



     RPM package creation selected    


This package will be built according to these values:

1 -  Summary: [ Package created with checkinstall 1.6.0 ]
2 -  Name:    [ rubygems ]
3 -  Version: [ 1.3.6 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ rubygems-1.3.6 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ rubygems ]

Enter a number to change any of them or press ENTER to continue: 11
Enter the additional requirements:
>

This package will be built according to these values:

1 -  Summary: [ Package created with checkinstall 1.6.0 ]
2 -  Name:    [ rubygems ]
3 -  Version: [ 1.3.6 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ rubygems-1.3.6 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ rubygems ]

Enter a number to change any of them or press ENTER to continue:

Installing with ruby setup.rb...

========================= Installation results ===========================
RubyGems 1.3.6 installed

=== 1.3.6 / 2010-02-17

NOTE:

http://rubygems.org is now the default source for downloading gems.

You may have sources set via ~/.gemrc, so you should replace
http://gems.rubyforge.org with http://rubygems.org

http://gems.rubyforge.org will continue to work for the forseeable future.

New features:

 `gem` commands
   Added `gem push` and `gem owner` for interacting with modern/Gemcutter
    sources
   `gem dep` now supports --prerelease.
   `gem fetch` now supports --prerelease.
   `gem server` now supports --bind.  Patch #27357 by Bruno Michel.
   `gem rdoc` no longer overwrites built documentation.  Use --overwrite
    force rebuilding.  Patch #25982 by Akinori MUSHA.
 Captial letters are now allowed in prerelease versions.

Bug fixes:

 Development deps are no longer added to rubygems-update gem so older
  versions can update sucessfully.
 Installer bugs:
   Prerelease gems can now depend on non-prerelease gems.
   Development dependencies are ignored unless explicitly needed.  Bug #27608
    by Roger Pack.
 `gem` commands
   `gem which` now fails if no paths were found.  Adapted patch #27681 by
    Caio Chassot.
   `gem server` no longer has invalid markup.  Bug #27045 by Eric Young.
   `gem list` and friends show both prerelease and regular gems when
    --prerelease --all is given
 Gem::Format no longer crashes on empty files.  Bug #27292 by Ian Ragsdale.
 Gem::GemPathSearcher handles nil require_paths. Patch #27334 by Roger Pack.
 Gem::RemoteFetcher no longer copies the file if it is where we want it.
  Patch #27409 by Jakub ????astny.

Deprecation Notices:

 lib/rubygems/timer.rb has been removed.
 Gem::Dependency#version_requirements is deprecated and will be removed on or
  after August 2010.
 Bulk index update is no longer supported.
 Gem::manage_gems was removed in 1.3.3.
 Time::today was removed in 1.3.3.


                                                                                                                                                          • -
RubyGems installed the following executables: /usr/bin/gem ======================== Installation successful ========================== Copying documentation directory... ./ ./ChangeLog ./README Copying files to the temporary directory...OK Striping ELF binaries and libraries...OK Compressing man pages...OK Building file list...OK Building RPM package...OK NOTE: The package will not be installed Erasing temporary files...OK Deleting temp dir...OK Done. The new package has been saved to /usr/src/redhat/RPMS/i386/rubygems-1.3.6-1.i386.rpm You can install it in your system anytime using: rpm -i rubygems-1.3.6-1.i386.rpm

再び /usr/src/redhat/RPMS/i386/rubygems-1.3.6-1.i386.rpmrpmができました。これをインスコします。

# rpm -ivh /usr/src/redhat/RPMS/i386/rubygems-1.3.6
準備中...                ########################################### [100%]
   1:rubygems-1.3.6        ########################################### [100%]

はい入りました。which

# which gem
/usr/bin/gem

ああ、医者にかかんなくて済んだぜ。ここまできたらこっちのもんだぜ。

railsのインストール

もうなんら問題なくrailsをインストールできます。

# gem install rails -y
INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list
Successfully installed rake-0.8.7
Successfully installed activesupport-2.3.5
Successfully installed activerecord-2.3.5
Successfully installed rack-1.0.1
Successfully installed actionpack-2.3.5
Successfully installed actionmailer-2.3.5
Successfully installed activeresource-2.3.5
Successfully installed rails-2.3.5
8 gems installed
Installing ri documentation for rake-0.8.7...
Installing ri documentation for activesupport-2.3.5...
Installing ri documentation for activerecord-2.3.5...
Installing ri documentation for rack-1.0.1...
Installing ri documentation for actionpack-2.3.5...
Installing ri documentation for actionmailer-2.3.5...
Installing ri documentation for activeresource-2.3.5...
Installing ri documentation for rails-2.3.5...
Installing RDoc documentation for rake-0.8.7...
Installing RDoc documentation for activesupport-2.3.5...
Installing RDoc documentation for activerecord-2.3.5...
Installing RDoc documentation for rack-1.0.1...
Installing RDoc documentation for actionpack-2.3.5...
Installing RDoc documentation for actionmailer-2.3.5...
Installing RDoc documentation for activeresource-2.3.5...
Installing RDoc documentation for rails-2.3.5...

長かった…。

# rails -v
Rails 2.3.5

これでインスコ完了です。何度か死ぬかと思いましたので、転載してここにまとめておきます。ちなみに転載時点で確認してみたら、Ruby1.8.7はp302になってまして、gemは1.3.7が出てますのでご注意下さい。