SBT:在另一个项目的构建过程中使用来自一个项目的代码

时间:2015-10-06 12:34:20

标签: scala sbt build-process multi-project

我有一个多项目构建,比如项目A和B(root中build.sbt的例子):

lazy val projectA = (project in file("A"))
lazy val projectB = (project in file("B"))

我想使用projectA中的代码生成一些.java文件,并在projectB的编译步骤运行之前将它们作为projectB构建过程的一部分放在projectB中。我在projectA中有一个Scala对象。本质上,我在projectA中有一个编译器,它在运行编译步骤之前生成需要在projectB 中的文件。我尝试了以下内容:

1)使projectB依赖于projectA:

lazy val projectB = (project in file("B")) dependsOn(projectA):

2)创建projectB / project / Build.scala where-in我定义一个Task:

import projectA.somePackage.ourObject
val myTask = taskKey[Unit]("runs before compilation")

myTask := {
    ourObject.thatMethod()
}

(compile in Compile) <<= (compile in Compile) dependsOn(myTask)

但是,我无法从此文件中的projectA导入内容。我可能试图以错误的方式做到这一点,但我找不到任何教程或示例向我展示如何做到这一点:(

1 个答案:

答案 0 :(得分:1)

不幸的是,这不是一个完整的答案,但它应该比评论更具可读性:

由于SBT是递归的,projectB/project本身就是一个SBT项目,可能依赖projectA(相应地添加projectB/project/project/Build.scalaprojectB/project/build.sbt)。不确定这是否有效。

我认为正确的做法是让projectB:compile依赖于projectA:run,例如

(compile in (projectB, Compile)) <<= (compile in (projectB, Compile)).dependsOn(run in (projectA, Compile))

如果您需要使用的对象不是run使用的默认对象,请在projectA中添加一个新任务,专门用于运行代码生成。