我有一个SBT Scala多项目,结构如下:
multiprojectRoot
project/SharedProjectBuildCode.scala
project1
src/sourceFiles
project1-build.sbt
project2
src/sourceFiles
project2-build.sbt
projectN
src/sourceFiles
projectN-build.sbt
multiprojectRoot / project / SharedProjectBuildCode.scala:包含使用dependsOn创建对本地项目的依赖项的多项目定义。例如:
lazy val project2 = Project(
...
).dependsOn(project1)
multiprojectRoot / project2 / project2-build.sbt:包含给定项目的设置和依赖项。例如:
name := "project2"
libraryDependencies ++= Seq(
...
"my.company" % "project1" % "1.0"
)
在SharedProjectBuildCode.scala文件中使用dependsOn声明对project1的第一个依赖项,在独立的project2-build.sbt构建定义文件中创建第二个依赖项。
因此,project2定义包含:
我们希望保留此项目结构,因为这是我们当前工作流程的最佳选择:
我们需要控制这种依赖性模糊。你能帮助我吗?
答案 0 :(得分:1)
我认为你应该在SharedProjectBuildCode.scala
lazy val root = Project(id = "Main-Project",
base = file(".")) aggregate(project1, project2,..)
lazy val project2 = Project(id = "project2",
base = file("project1")).dependsOn(project1)
...
不再需要在build.sbt中添加依赖项了。
答案 1 :(得分:1)
通过使用SBT提供的构建文件加载规则,我能够控制在每个用例上加载的依赖集。
从给定的根目录加载SBT时,它会在根目录中查找* .sbt文件,并在根目录/项目目录中查找* .scala文件。如果您有多项目构建,那么它还会读取子项目中遇到的 .sbt文件的定义,但它不会在子项目中使用project / .scala文件:
所以,我按照以下方式改变了我的多项目构建:
multiprojectRoot
project/SharedProjectBuildCode.scala
project1
src/sourceFiles
project/DeploymentOnlyCode.scala
project1-build.sbt
project2
src/sourceFiles
project/DeploymentOnlyCode.scala
project2-build.sbt
projectN
src/sourceFiles
project/DeploymentOnlyCode.scala
projectN-build.sbt
这样,根据用例我从多项目根目录或项目内部目录运行SBT:
现在,一个项目有3个代码实例,它们聚合最终构建的属性:
这也可以最大程度地控制项目的构建方式,是否是可释放的工件,并且只处理与给定项目相关的源代码,作为一个完整且独立的部分。