构建器:如何定义依赖于同一Buildfile中另一个项目的项目?

时间:2012-09-21 22:51:27

标签: scala buildr

这似乎是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

我该如何实现?我知道将这两个项目分开可能看似人为,但我有一些更复杂的想法,这个例子将问题归结为其基本组成部分。

2 个答案:

答案 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

两个子项目libapp会自动映射到lib/app/子目录,Buildr会自动查找src/main/scala下的来源每个。

答案 1 :(得分:0)

项目布局的Buildr常用约定在target/classestarget/test/classes中查找已编译的类。我看到你的构建正在将类放入target/main/classes

因此,您需要将scala参数更改为预期位置,或更改布局以包含:

lib_layout[:target, :main, :scala] = 'target/main/classes'

如果您还需要更改测试类的布局(我猜你没有),请使用:

lib_layout[:target, :test, :scala] = ...
相关问题