我有一个多项目构建,比如项目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导入内容。我可能试图以错误的方式做到这一点,但我找不到任何教程或示例向我展示如何做到这一点:(
答案 0 :(得分:1)
不幸的是,这不是一个完整的答案,但它应该比评论更具可读性:
由于SBT是递归的,projectB/project
本身就是一个SBT项目,可能依赖projectA
(相应地添加projectB/project/project/Build.scala
或projectB/project/build.sbt
)。不确定这是否有效。
我认为正确的做法是让projectB:compile
依赖于projectA:run
,例如
(compile in (projectB, Compile)) <<= (compile in (projectB, Compile)).dependsOn(run in (projectA, Compile))
如果您需要使用的对象不是run
使用的默认对象,请在projectA
中添加一个新任务,专门用于运行代码生成。