我有一个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"
)
第一次依赖于project1是在SharedProjectBuildCode.scala文件中使用dependsOn声明的,第二次是在独立的project2-build.sbt构建定义文件中创建的 .
因此,project2定义包含:
-
对project1或 . 的模糊依赖
-
对project1的双重依赖
我们希望保留这个项目结构,因为它对我们当前的工作流程是最好的:
-
独立.sbt文件为我们的持续交付服务器上的每个项目提供独立部署目的 .
-
带有dependsOn的多项目.scala文件用于促进开发,允许我们避免诸如连续publishLocal之类的事情 .
我们需要控制这种依赖性模糊 . 你能帮助我吗?
2 回答
我想你应该在
SharedProjectBuildCode.scala
而且不再需要在build.sbt中添加依赖项了 .
通过使用SBT提供的构建文件加载规则,我能够控制在每个用例上加载的依赖集 .
从给定的根目录加载SBT时,它会在根目录中查找* .sbt文件,并在根目录/项目目录中查找* .scala文件 . 如果您有多项目构建,那么它还会读取子项目中遇到的.sbt文件的定义,但它不会在子项目中使用project / .scala文件:
所以,我改变了我的多项目构建方式如下:
这样,根据用例我从多项目根目录或项目内部目录运行SBT:
开发:SBT从multiprojectRoot目录运行 . 它具有多项目构建的优点(例如使用dependsOn并避免使用publishLocal) .
生产环境 :SBT从具体项目目录中运行,例如multiprojectRoot / project2 . 它允许将项目构建为独立项,将所有依赖项作为显式外部项(对于在 生产环境 ,连续集成服务器上声明一系列依赖项非常有用) .
现在,一个项目有3个代码实例,它们聚合最终构建的属性:
multiprojectRoot / project / SharedProjectBuildCode.scala:包含本地依赖项和与多项目构建相关的其他代码 .
multiprojectRoot / project1 / project1-build.sbt:包含项目构建属性,通常用于项目的多项目和独立构建,例如始终为外部的名称或依赖项 . 对于同一级别的其他多项目项目也应该这样做,明确地将其视为外部依赖项工件 .
multiprojectRoot / project1 / project / DeploymentOnlyCode.scala:包含仅在独立构建时考虑的构建属性 . 如果需要定义特定于部署的属性,则可以对其他子项目执行相同的操作 .
这也可以最大程度地控制项目的构建方式,是否是可释放的工件,并且只处理与给定项目相关的源代码,作为完整且独立的部分 .