2012-09-08

bundle exec rake で TypeError

RubyGemsの開発中に起こった怖い話。

bundle gem gem名

で生成したプロジェクトで、Rakeの標準タスクにRSpecを設定して

bundle exec rake

を実行すると、TypeErrorが発生。

メッセージには、

ClassName is not a class

とある。クラスなのにクラスじゃないって?

単に

rake

や、

rspec spec

だとエラーは出ない。

ひと通り悩んだ後、libディレクトリを検索すると、デフォルトでgem名のモジュールが定義されているのを発見。確かに、バージョン番号を上げるときに見た記憶がある。

そして、TypeErrorとなったクラスはgem名と同じ名前だった…。

bundle exec すると、クラスの前にモジュールがロードされていて、名前衝突してしまったというのが今回のオチ。

GitHubを見渡しても、gem名と同じ名前のクラスがあるgemは見当たらなかった。 どうやらRubyGems開発のお作法のようだ。

教訓

  • gem名と同じ名前のクラスは作らない。
  • 作るにしても、gem名モジュールの中にする。
  • 基本的に、クラスやモジュールはgem名モジュールの中に作る。
  • gem名モジュールの名前を変えるだなんて とんでもない!

功利主義と多数決

case 1

  • Aさん: 80 happiness
  • Bさん: 80 happiness
  • Cさん: 80 happiness

case 2

  • Aさん: 100 happiness
  • Bさん: 100 happiness
  • Cさん: 0 happiness

elected

  • 功利主義: case1
  • (単純な)多数決: case2