这似乎是Buildr中的一个简单任务,所以我必须遗漏一些明显的东西,因为我无法使它工作。假设我有一个包含两个文件的目录,如下所示:
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
。
我该如何实现?我知道将这两个项目分开可能看似人为,但我有一些更复杂的想法,这个例子将问题归结为其基本组成部分。
答案 0 :(得分:1)
使用Buildr描述项目的惯用方法是使用子项目,
注意:下面的buildfile
会进入test/
目录。
require 'buildr/scala'
define "my-project" do
define "lib" do
end
define "app" do
compile.with project("lib").compile.target
end
end
两个子项目lib
和app
会自动映射到lib/
和app/
子目录,Buildr会自动查找src/main/scala
下的来源每个。
答案 1 :(得分:0)
项目布局的Buildr常用约定在target/classes
和target/test/classes
中查找已编译的类。我看到你的构建正在将类放入target/main/classes
:
因此,您需要将scala参数更改为预期位置,或更改布局以包含:
lib_layout[:target, :main, :scala] = 'target/main/classes'
如果您还需要更改测试类的布局(我猜你没有),请使用:
lib_layout[:target, :test, :scala] = ...