sbtで、ルートディレクトリをソースディレクトリから外す方法

http://d.hatena.ne.jp/wistery_k/20120813

なんとなくプロジェクトディレクトリのルートでln -s src/main/scala/jp/wistery/Hoge.scala してたらエラーが出てハマった。
さすがにsrc以下だけコンパイル対象にしてると思ったらそんなことはなくて、
別々のソースコードと思われて、2重にコンパイルされたよう。

そうなんです、詳しい経緯はしらないけど、src/main/scala 以外に、ルートディレクトリはデフォルトだとソースディレクトリになってます。
で、多分以下の数行をbuild.sbtに書けばできるはず*1

unmanagedSources in Compile <<= (unmanagedSources in Compile, baseDirectory) map {
  (srcs,b) => srcs filterNot (b * "*").get.toSet
}

自分も、たまにハマったことあるし、他にもこれを感じている人がいたらしく、これを簡単に設定できるKeyがちょっと前に追加されたのですが

https://github.com/sbt/sbt/issues/494

残念ながら sbt 0.12.0 の時点では*2 含まれていないようです。この変更が入ったversionがリリースされれば(0.12.1から入りました) 以下のように書くだけでいけるようになるはずです

sourcesInBase := false

*1:もっと短くかけるとか、これじゃまずいとかあったら教えて下さい

*2:以前出した0.12系のRCとの互換性のため?