技術書のサンプル試す場合はバージョンを揃えるべきなのか

『RailsによるアジャイルWebアプリケーション開発』、大変くだらないところでつまずいているというか、なんか知らんがエラー出まくりで先に進めず。

問題が起きたのはp.79。モデルクラスのrbファイルにvalidatesメソッドによる検証過程を書き入れ、test/functional/xxxに有効なテストデータ(とされるもの)を入れてrake testコマンドを発行したところ、エラーが出る。何度やってもエラーが出る。仕方ないので一旦先に進もうともしたのだが、次に編集対象になっていたtest/unitフォルダが見当たらない。念のため別プロジェクトを作ったりもしてみたが、やはりtest/unitは生成されなかった。さすがにディレクトリ構造丸ごと違うとなると、自分のミスというよりはバージョンの相違によるものではないかと思い至る。この本ではRubyの1.9.2とrails 3.1.0を使っていたが、僕の環境はRuby2.0とrails 4.0.0だった(もっと他にも「バージョンが原因ではないか?」と思い当たった根拠があったはずなのだが失念。トラブルシュートは記録しながらやるべきだったなー……)。

というわけでRubyとrailsのバージョンを下げる。Rubyについてはrvmで管理しているので簡単に変更できたが、問題はrails。軽くググった感じでは、一度アンインストールしてから再度バージョン指定して入れなおせばよいという話だった。

#gem uninstall rails

#gem install rails -v 3.1.0

が、これだけで再びrake testを試すとまだエラー。Gemfile内のバージョン表記を変えろとのことだったので変更し、#bundle update。bundleについてはよくわかってないのでおいおい調べる予定。

しかし、まだエラー。エラーというより、SECURITY WARNINGとやらが表示された。どうもrails過去バージョンの脆弱性に起因するらしい。こういった事例がいくつかあり、最終的にはRails 3.2.13まで上げざるを得なかった。

popowa: SECURITY WARNING: No secret option provided to Rack::Session::Cookie と出たら

Rails emits warning: “Rack::File headers parameter replaces cache_control after Rack 1.5” - Stack Overflow

ここまででもうかなり疲れていたのだが、これでもまだ尚エラーが出るから嫌になる。Gemfileのcoffee-railsのバージョンがよろしくないらしく、以下サイトを参考にして編集。

Rails 3.1.3 -> 3.2.11 のアップデートで railties のdependencyが競合エラーになった - The longest day in my life

んで結論を言えばこれでもまだ上手く行かず、最終的にはRailsとRubyのバージョンを揃えた上で、イチからプロジェクトを作りなおしたらやっとエラーが出なくなった。もう自分のやってること何もかも間違ってる気がしてくる。

で、今回の一件からの考察というか帰結なのだが、技術書に沿って勉強していく場合、やはり技術書と同じバージョンの環境で進めていくべきなのだろうか。僕はそのへんわりと甘く見てしまっていたので、今回は「いや最新環境に慣れといた方がいいんじゃね? Ruby2.0も最近出たとこで覚えといた方が得な気がするし」などという考えでRuby2.0とRails4.0.0を使っていたのだが、結果はこれである。Androidの勉強も似たような考え方でだいたい最新か、あるいは一つ前のOSで構築していたのだが、あちらは後方互換性が高いのか、それほど困ることもなかったので、Ruby on Railsでも安易に同じ事をしてしまった。

新しい環境に慣れておいた方がいい、というのはあると思う。が、技術書を読み進めていく上では、万が一バージョン相違によるエラーが出た場合、今回のように大きなロスを被ることになる。技術書、特にある分野での最初の一冊なんてのはとにかくまずは一冊流してみた方がいいわけで、最新バージョンへの対応なんてのはその後でゆっくり覚えればいいのかもしれない。旧バージョンの方がノウハウが多く蓄積されていて、エラー対処がしやすいという利点もある。とはいえ、Railsは旧バージョンを使っていると脆弱性の警告が出る場合があるので、新しいバージョンを使わざるを得ない場合もあるようなのだが。。。

あと、今回のトラブルシュートでいろいろググってみたところ、Stack Overflowが引っかかってくることが非常に多かった。やっぱ英語は必須。