控制依赖性加载SBT多项目的歧义

时间:2015-10-01 18:55:01

标签: scala build sbt

我有一个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定义包含:

  • 对project1或
  • 的模糊依赖
  • 对project1的双重依赖

我们希望保留此项目结构,因为这是我们当前工作流程的最佳选择:

  • 独立的.sbt文件为我们的持续交付服务器上的每个项目提供独立的部署目的。
  • 带有dependsOn的多项目.scala文件用于促进开发,允许我们避免连续发布本地的事情。

我们需要控制这种依赖性模糊。你能帮助我吗?

2 个答案:

答案 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文件:

  

.sbt build definition

     

Multi-project builds

所以,我按照以下方式改变了我的多项目构建:

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:

  • 开发:SBT从 multiprojectRoot 目录运行。它具有多项目构建的优势(例如使用dependsOn并避免使用publishLocal)。
  • 生产:SBT从具体项目目录中运行,例如 multiprojectRoot / project2 。它允许将项目构建为独立项目,将所有依赖项作为显式外部项(对于在生产,连续集成服务器上声明一系列依赖项非常有用)。

现在,一个项目有3个代码实例,它们聚合最终构建的属性:

  1. multiprojectRoot / project / SharedProjectBuildCode.scala:包含与多项目构建相关的本地依赖项和其他代码。
  2. multiprojectRoot / project1 / project1-build.sbt:包含项目构建属性,通常用于项目的多项目和独立构建,例如始终为外部的名称或依赖项。对于同一级别的其他多项目项目也应该这样做,明确地将其视为外部依赖项工件。
  3. multiprojectRoot / project1 / project / DeploymentOnlyCode.scala:包含仅在独立构建时考虑的构建属性。如果需要定义特定于部署的属性,则可以对其他子项目执行相同的操作。
  4. 这也可以最大程度地控制项目的构建方式,是否是可释放的工件,并且只处理与给定项目相关的源代码,作为一个完整且独立的部分。