古いRails環境を再起動するまで

古いRails環境というのは、具体的にはRails1.1.6である。実はこのブログの始まりは、Railsの学習の記録であった。むかしむかし、このブログ創世の頃、Railsはバージョン1.1.6がメジャーであった。そのため、自分のMacBookの中には、Rails1.1.6の実験プロジェクトがたくさんある。

しかし、現在のRailsはバージョン4.1.7まで進んでしまった。過去のプロジェクトをちょっと動かして試してみたい衝動に駆られても、エラー出まくり。まったく動かない...。このまま永遠に起動しないRailsプロジェクトが残り続けるのも悲しいので、昔の環境を整えて、過去の遺産を再起動してみようと思い立った。以下は、MacBook Pro Retina15 OSX 10.9.5の環境で、Rails1.1.6を起動するまでの記録。

HomebrewとCommand Line Toolsを使う

  • rbenvをインストールするために、Homebrewを使った。
  • 自分のMacBook環境に既にインストール済みだったので。
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Command Line Toolsのインストール
    • Homebrewがビルドする時に必要になるので。
$ xcode-select --install
    • 入れないで使いだすと、入れてねって言われる。
Warning: No developer tools installed.
You should install the Command Line Tools.
Run `xcode-select --install` to install them.

rbenv環境をインストール

  • rbenvは、複数のRuby環境を素早く切り替えて使い分けるツール。
  • rbenvを快適に使うためには、以下二つのgemも入れた方が良さそう。
    • rbenv-default-gems(新規ruby環境インストール時に、default-gemsに設定したgemもインストールしてくれる)
    • rbenv-gem-rehashruby環境切替時に必要なrbenv rehashコマンドを良きに計らい実行してくれる)
    • どちらもrbenvと同じ作者の方が開発しているツールのようだ。
  • 依存関係によって、以下のコマンドで必要なrbenv環境がインストールされる。
$ brew install rbenv-default-gems rbenv-gem-rehash
🍺  /usr/local/Cellar/rbenv/0.4.0: 31 files, 152K, built in 2 seconds
🍺  /usr/local/Cellar/ruby-build/20141016: 129 files, 552K, built in 2 seconds
🍺  /usr/local/Cellar/rbenv-default-gems/1.0.0: 4 files, 16K, built in 2 seconds
🍺  /usr/local/Cellar/rbenv-gem-rehash/1.0.0: 7 files, 24K, built in 2 seconds


rbenv、ruby-build、rbenv-default-gems、rbenv-gem-rehashがインストールされた!

rbenvを使う準備

  • そのターミナル環境でrbenvを使うためには、最初に必ずeval "$(rbenv init -)"しておく必要がある。
$ eval "$(rbenv init -)"
  • また上記コマンドは、ターミナルでタブやウィンドウを開く度に毎回必要になるので、使っているシェル環境の設定ファイルに追記しておくのだ。
    • 自分の場合は、bashを使っているので、~/.bashrcに追記しておいた。
    • ちなみに自分の環境は、~/.bash_profileが~/.bashrcを読み込む設定になっている。
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
  • まだ、OSXデフォルトのRuby環境しかない。
 $ rbenv versions
 * system (set by /Users/zari/.rbenv/version)

Ruby-1.8.7をインストール

  • rbenvでインストール可能なRubyのバージョンを調べる。
$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  1.8.7-p358
  1.8.7-p370
  1.8.7-p371
  1.8.7-p374
  1.8.7-p375
  1.9.1-p378
  1.9.1-p430
  1.9.2-p0
...中略...
  • ズラッとリスト表示されて迷う。
  • Rails1.1.6当時のRubyは1.8世代。
  • よって1.8系の最終パッチの1.8.7-p375に決めた。
  • しかし、インストールするとエラーが発生...。
$ rbenv install 1.8.7-p375
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1

ERROR: This package must be compiled with GCC, but ruby-build couldn't
find a suitable `gcc` executable on your system. Please install GCC
and try again.

DETAILS: Apple no longer includes the official GCC compiler with Xcode
as of version 4.2. Instead, the `gcc` executable is a symlink to
`llvm-gcc`, a modified version of GCC which outputs LLVM bytecode.

For most programs the `llvm-gcc` compiler works fine. However,
versions of Ruby older than 1.9.3-p125 are incompatible with
`llvm-gcc`. To build older versions of Ruby you must have the official
GCC compiler installed on your system.

TO FIX THE PROBLEM: Install Homebrew's apple-gcc42 package with this
command: brew tap homebrew/dupes ; brew install apple-gcc42

You will need to install the official GCC compiler to build older
versions of Ruby even if you have installed Apple's Command Line Tools
for Xcode package. The Command Line Tools for Xcode package only
includes `llvm-gcc`.

BUILD FAILED (OS X 10.9.5 using ruby-build 20141016)
  • エラーメッセージを真剣に読むと...
    • どうやらXcode4.2以降は、gccllvm-gccを示すシンボルリンクになってしまったと。
    • そのため、バージョン1.9.3-p125より古いRubyは、ビルドできなくなってしまったと。
    • 古いRubyをビルドするには、GCCコンパイラーが必要になると。
  • どうやら、以下のコマンドでHomebrewでgccをインストールするようだ。
$ brew tap homebrew/dupes ; brew install apple-gcc42
🍺  /usr/local/Cellar/apple-gcc42/4.2.1-5666.3: 104 files, 75M, built in 2 seconds

gcc-4.2、インストール完了!

  • 気を取り直して、もう一度Ruby-1.8.7-p375をインストール。
$ rbenv install 1.8.7-p375
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Checking out http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_7...
Installing ruby-1.8.7-p375...
Installed ruby-1.8.7-p375 to /Users/zari/.rbenv/versions/1.8.7-p375

Downloading rubygems-1.6.2.tgz...
Installing rubygems-1.6.2...
Installed rubygems-1.6.2 to /Users/zari/.rbenv/versions/1.8.7-p375

Ruby-1.8.7-p375、rubygems-1.6.2、インストール完了!

Ruby環境の切替

  • さっそく、Ruby-1.8.7-p375に切り替えてみる。
    • 先頭の*が現在選択されているRuby環境を示すマーク。
 $ rbenv versions
 * system (set by /Users/zari/.rbenv/version)
   1.8.7-p375

 $ rbenv global 1.8.7-p375

 $ rbenv versions
   system
 * 1.8.7-p375 (set by /Users/zari/.rbenv/version)
  • rubyバージョンとgemのインストール先が、ちゃんと変更されていることを確認する。
$ ruby -v
ruby 1.8.7 (2013-12-22 patchlevel 375) [i686-darwin13.4.0]

$ gem env home
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8
  • もし、上記のように変更されていなかったら、rbenv rehashコマンドを実行してみる。
    • 本来は、rbenv-gem-rehashが良きに計らい自動で実行してくれるはず。
    • rbenvインストール後の初回の切替のみ、rbenv rehashの実行が必要になるかもしれない。

railsをインストール

  • rbenvで切り替えたRuby-1.8.7-p375環境にRailsをインストールしてみる。
  • Railsのバージョンを確認してみる。
$ gem search ^rails$ -ra

 *** REMOTE GEMS ***

rails (4.1.7, 4.1.6, 4.1.5, 4.1.4, 4.1.3, 4.1.2, 4.1.1, 4.1.0, 4.0.11, 4.0.10, 4.0.9, 4.0.8, 4.0.7, 4.0.6, 4.0.5, 4.0.4, 4.0.3, 4.0.2, 4.0.1, 4.0.0, 3.2.20, 3.2.19, 3.2.18, 3.2.17, 3.2.16, 3.2.15, 3.2.14, 3.2.13, 3.2.12, 3.2.11, 3.2.10, 3.2.9, 3.2.8, 3.2.7, 3.2.6, 3.2.5, 3.2.4, 3.2.3, 3.2.2, 3.2.1, 3.2.0, 3.1.12, 3.1.11, 3.1.10, 3.1.9, 3.1.8, 3.1.7, 3.1.6, 3.1.5, 3.1.4, 3.1.3, 3.1.2, 3.1.1, 3.1.0, 3.0.20, 3.0.19, 3.0.18, 3.0.17, 3.0.16, 3.0.15, 3.0.14, 3.0.13, 3.0.12, 3.0.11, 3.0.10, 3.0.9, 3.0.8, 3.0.7, 3.0.6, 3.0.5, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 2.3.18, 2.3.17, 2.3.16, 2.3.15, 2.3.14, 2.3.12, 2.3.11, 2.3.10, 2.3.9, 2.3.8, 2.3.7, 2.3.6, 2.3.5, 2.3.4, 2.3.3, 2.3.2, 2.2.3, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.4, 2.0.2, 2.0.1, 2.0.0, 1.2.6, 1.2.5, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.6, 1.1.5, 1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.0, 0.14.4, 0.14.3, 0.14.2, 0.14.1, 0.13.1, 0.13.0, 0.12.1, 0.12.0, 0.11.1, 0.11.0, 0.10.1, 0.10.0, 0.9.5, 0.9.4.1, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.5, 0.8.0)
  • ズラッとRailsのバージョンが並んだ。
  • 欲しいバージョン1.1.6もちゃんとある。
  • Rails-1.1.6をインストール。
$ gem install rails -v 1.1.6
Fetching: rake-10.3.2.gem (100%)
Fetching: activesupport-1.3.1.gem (100%)
Fetching: activerecord-1.14.4.gem (100%)
Fetching: actionpack-1.12.5.gem (100%)
Fetching: actionmailer-1.2.5.gem (100%)
Fetching: actionwebservice-1.1.6.gem (100%)
Fetching: rails-1.1.6.gem (100%)
Successfully installed rake-10.3.2
Successfully installed activesupport-1.3.1
Successfully installed activerecord-1.14.4
Successfully installed actionpack-1.12.5
Successfully installed actionmailer-1.2.5
Successfully installed actionwebservice-1.1.6
Successfully installed rails-1.1.6
7 gems installed
Installing ri documentation for rake-10.3.2...
Installing ri documentation for activesupport-1.3.1...
ERROR:  While generating documentation for activesupport-1.3.1

... MESSAGE: Unhandled special: Special: type=17, text=""

... RDOC args: --ri --op /Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/doc/activesupport-1.3.1/ri lib --title activesupport-1.3.1 Documentation --quiet
  • インストールできたようだ。
    • ドキュメントのインストールでエラーが出ているけど、気にしないことにした。
  • データベースはsqlite3を使うつもりなので、それもインストール。
    • 正確にはrubyからsqlite3コマンドを利用するgemパッケージなのだ。
$ gem install sqlite3
Fetching: sqlite3-1.3.10.gem (100%)
Building native extensions.  This could take a while...
Successfully installed sqlite3-1.3.10
1 gem installed
...中略...
    • sqlite3コマンド自体はOSXに標準インストールされている。
$ which sqlite3
/usr/bin/sqlite3

懐かしのscaffold

  • todoプロジェクトの開始!
$ rails todo
      create  
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  components
      create  db
      create  doc
      create  lib
      create  lib/tasks
      create  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  script/process
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/mocks/development
      create  test/mocks/test
      create  test/unit
      create  vendor
      create  vendor/plugins
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  Rakefile
      create  README
      create  app/controllers/application.rb
      create  app/helpers/application_helper.rb
      create  test/test_helper.rb
      create  config/database.yml
      create  config/routes.rb
      create  public/.htaccess
      create  config/boot.rb
      create  config/environment.rb
      create  config/environments/production.rb
      create  config/environments/development.rb
      create  config/environments/test.rb
      create  script/about
      create  script/breakpointer
      create  script/console
      create  script/destroy
      create  script/generate
      create  script/performance/benchmarker
      create  script/performance/profiler
      create  script/process/reaper
      create  script/process/spawner
      create  script/runner
      create  script/server
      create  script/plugin
      create  public/dispatch.rb
      create  public/dispatch.cgi
      create  public/dispatch.fcgi
      create  public/404.html
      create  public/500.html
      create  public/index.html
      create  public/favicon.ico
      create  public/robots.txt
      create  public/images/rails.png
      create  public/javascripts/prototype.js
      create  public/javascripts/effects.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/controls.js
      create  public/javascripts/application.js
      create  doc/README_FOR_APP
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log

$ cd todo

$ script/generate model todo
./script/../config/boot.rb:25:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
./script/../config/boot.rb:25:Warning: Gem::SourceIndex#search support for String patterns is deprecated, use #find_name
./script/../config/boot.rb:28: undefined method `require_gem' for main:Object (NoMethodError)
	from script/generate:2:in `require'
	from script/generate:2
  • エラーで止まった。
  • エラー箇所を確認してみると、require_gemの部分。
  • たしかgem1.0以降、require_gemは廃止されている。
  • たぶん、そのせい。TextMateで以下のように修正してみた。
$ mate config/boot.rb
$ diff -u <(pbpaste) config/boot.rb
--- /dev/fd/63	2014-10-30 17:28:00.000000000 +0900
+++ config/boot.rb	2014-10-30 17:27:43.000000000 +0900
@@ -25,7 +25,7 @@
       rails_gem = Gem.cache.search('rails', "=#{version}").first
 
       if rails_gem
-        require_gem "rails", "=#{version}"
+        gem "rails", "=#{version}"
         require rails_gem.full_gem_path + '/lib/initializer'
       else
         STDERR.puts %(Cannot find gem for Rails =#{version}:
@@ -35,7 +35,7 @@
         exit 1
       end
     else
-      require_gem "rails"
+      require "rails"
       require 'initializer'
     end
   end
  • 気を取り直して、script/generate model todoからやり直し。
$ script/generate model todo
./script/../config/boot.rb:25:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
./script/../config/boot.rb:25:Warning: Gem::SourceIndex#search support for String patterns is deprecated, use #find_name
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/rails_generator/lookup.rb:199:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/rails_generator/lookup.rb:199:Warning: Gem::SourceIndex#search support for Regexp patterns is deprecated, use #find_name
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/todo.rb
      create  test/unit/todo_test.rb
      create  test/fixtures/todos.yml
      create  db/migrate
      create  db/migrate/001_create_todos.rb
  • 今度は正常に終了した。
  • データベースの設定
    • TextMateで以下のように修正した。
$ mate config/database.yml
$ diff -u <(pbpaste) config/database.yml
--- /dev/fd/63	2014-10-30 17:34:05.000000000 +0900
+++ config/database.yml	2014-10-30 17:34:02.000000000 +0900
@@ -11,25 +11,19 @@
 # And be sure to use new-style password hashing:
 #   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
 development:
-  adapter: mysql
-  database: todo_development
-  username: root
-  password:
-  host: localhost
+  adapter: sqlite3
+  database: db/development.sqlite3
+  timeout: 5000
 
 # Warning: The database defined as 'test' will be erased and
 # re-generated from your development database when you run 'rake'.
 # Do not set this db to the same as development or production.
 test:
-  adapter: mysql
-  database: todo_test
-  username: root
-  password:
-  host: localhost
+  adapter: sqlite3
+  database: db/test.sqlite3
+  timeout: 5000
 
 production:
-  adapter: mysql
-  database: todo_production
-  username: root
-  password: 
-  host: localhost
+  adapter: sqlite3
+  database: db/production.sqlite3
+  timeout: 5000
$ mate db/migrate/001_create_todos.rb
$ diff -u <(pbpaste) db/migrate/001_create_todos.rb
--- /dev/fd/63	2014-10-30 17:30:05.000000000 +0900
+++ db/migrate/001_create_todos.rb	2014-10-30 17:29:22.000000000 +0900
@@ -1,7 +1,12 @@
 class CreateTodos < ActiveRecord::Migration
   def self.up
     create_table :todos do |t|
-      # t.column :name, :string
+      t.column :body,       :string
+      t.column :due,        :date
+      t.column :done,       :boolean
+      
+      t.column :created_at, :datetime
+      t.column :updated_at, :datetime
     end
   end
$ rake db:migrate
/Users/zari/Desktop/rails116/todo/config/boot.rb:25:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
/Users/zari/Desktop/rails116/todo/config/boot.rb:25:Warning: Gem::SourceIndex#search support for String patterns is deprecated, use #find_name
rake aborted!
ERROR: 'rake/rdoctask' is obsolete and no longer supported. Use 'rdoc/task' (available in RDoc 2.4.2+) instead.
/Users/zari/Desktop/rails116/todo/Rakefile:8
(See full trace by running task with --trace)
  • しかし、エラーが出てしまった...。
  • 散々悩んだあげく、rakeをインストールし直してみようと削除して気付いた。
  • Rails1.1.6には、rakeのバージョンが進み過ぎているのかもしれない!
  • というわけで、削除した時に表示された(>=0.7.1)を信じて、再インストール。
$ gem uninstall rake

You have requested to uninstall the gem:
	rake-10.3.2
rails-1.1.6 depends on [rake (>= 0.7.1)]
If you remove this gems, one or more dependencies will not be met.
Continue with Uninstall? [Yn]  Y
Remove executables:
	rake

in addition to the gem? [Yn]  Y
Removing rake
Successfully uninstalled rake-10.3.2

$ gem install rake -v 0.7.1
Fetching: rake-0.7.1.gem (100%)
Successfully installed rake-0.7.1
1 gem installed
Installing ri documentation for rake-0.7.1...
Installing RDoc documentation for rake-0.7.1...
  • 気を取り直して、rake db:migrateを実行すると、正常に完了した!
$ rake db:migrate
(in /Users/zari/Desktop/rails116/todo)
/Users/zari/Desktop/rails116/todo/config/boot.rb:25:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
/Users/zari/Desktop/rails116/todo/config/boot.rb:25:Warning: Gem::SourceIndex#search support for String patterns is deprecated, use #find_name
 == CreateTodos: migrating =====================================================
 -- create_table(:todos)
    -> 0.0012s
 == CreateTodos: migrated (0.0012s) ============================================
  • いよいよ、最後の仕上げscaffoldだ。
$ script/generate scaffold todo
./script/../config/boot.rb:25:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
./script/../config/boot.rb:25:Warning: Gem::SourceIndex#search support for String patterns is deprecated, use #find_name
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/rails_generator/lookup.rb:199:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/rails_generator/lookup.rb:199:Warning: Gem::SourceIndex#search support for Regexp patterns is deprecated, use #find_name
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/todos
      exists  test/functional/
  dependency  model
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/rails_generator/lookup.rb:199:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/rails_generator/lookup.rb:199:Warning: Gem::SourceIndex#search support for Regexp patterns is deprecated, use #find_name
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
   identical    app/models/todo.rb
   identical    test/unit/todo_test.rb
   identical    test/fixtures/todos.yml
      create  app/views/todos/_form.rhtml
      create  app/views/todos/list.rhtml
      create  app/views/todos/show.rhtml
      create  app/views/todos/new.rhtml
      create  app/views/todos/edit.rhtml
      create  app/controllers/todos_controller.rb
      create  test/functional/todos_controller_test.rb
      create  app/helpers/todos_helper.rb
      create  app/views/layouts/todos.rhtml
      create  public/stylesheets/scaffold.css
  • 正常にscaffoldされたようだ!
  • サーバーを起動してみる。
$ script/server
./script/../config/boot.rb:25:Warning: Gem::cache is deprecated and will be removed on or after August 2011.  Use Gem::source_index.
./script/../config/boot.rb:25:Warning: Gem::SourceIndex#search support for String patterns is deprecated, use #find_name
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2014-10-31 14:15:02] INFO  WEBrick 1.3.1
[2014-10-31 14:15:02] INFO  ruby 1.8.7 (2013-12-22) [i686-darwin13.4.0]
[2014-10-31 14:15:02] INFO  WEBrick::HTTPServer#start: pid=37400 port=3000
  • 正常に稼働しているみたい。

ブラウザで動作確認

ちゃんと動いた!







稼働環境は以下のとおり

$ gem list

 *** LOCAL GEMS ***

actionmailer (1.2.5)
actionpack (1.12.5)
actionwebservice (1.1.6)
activerecord (1.14.4)
activesupport (1.3.1)
rails (1.1.6)
rake (0.7.1)
sqlite3 (1.3.10)