これは Buildr では単純なタスクのように思えますが、機能させることができないため、明らかな何かが欠けているに違いありません。次のように、2 つのファイルを含むディレクトリがあるとします。
test/lib/src/main/scala/MyLib.scala
test/app/src/main/scala/MyApp.scala
MyLib.scala
は:
class MyLib {
def hello() { println("Hello!") }
}
そしてMyApp.scala
、次のとおりです。
object MyApp extends App {
val ml = new MyLib
ml.hello()
}
これらを構築するのscalac
は簡単です:
$ cd test
$ scalac lib/src/main/scala/MyLib.scala -d target/main/classes
$ scalac app/src/main/scala/MyApp.scala -cp target/main/classes -d target/main/classes
$ cd target/main/classes/
$ scala MyApp
Hello!
Buildfile
ただし、これを(test
フォルダー内の)に変換しようとする私の素朴な試み:
require 'buildr/scala'
lib_layout = Layout.new
lib_layout[:source, :main, :scala] = 'lib/src/main/scala'
app_layout = Layout.new
app_layout[:source, :main, :scala] = 'app/src/main/scala'
define 'mylib', :layout => lib_layout do
end
define 'myapp', :layout => app_layout do
compile.with project('mylib')
end
次のエラーで失敗します:
(in /test, development)
Building mylib
Compiling myapp into /test/target/main/classes
/test/app/src/main/scala/MyApp.scala:2: error: not found: type MyLib
val ml = new MyLib
^
one error found
Buildr aborted!
RuntimeError : Failed to compile, see errors above
実行すると、失敗の理由はクラスパスに含まれていないためであることはbuildr --trace
明らかです。scalac
target/main/classes
どうすればこれを実現できますか? 2 つのプロジェクトを分離するのは不自然に思えるかもしれませんが、もっと洗練されたものを念頭に置いており、この例では問題をその本質的な構成要素にまで煮詰めました。