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