如何创建具有不同子项目的通用SBT根项目

时间:2018-11-03 08:44:07

标签: scala sbt

我正在Exercism中的Scala轨道上工作,这意味着我在根文件夹中有很多SBT项目。我想创建一个根SBT项目,该项目将在我下载新练习时自动添加新的子项目。目前,我必须手动添加它们,因此我的根build.sbt如下所示:

lazy val root = (project in file("."))
    .aggregate(
        hello_world,
        sum_of_multiples,
        robot_name)

lazy val hello_world = project in file("hello-world")
lazy val sum_of_multiples = project in file("sum-of-multiples")
lazy val robot_name = project in file("robot-name")

...但是我想避免必须手动添加每个项目。有没有办法自动添加新项目?

1 个答案:

答案 0 :(得分:4)

  

我希望避免手动添加每个项目。有没有办法自动添加新项目?

好的。 sbt的用法有些高级,但是您可以创建一个临时插件,以编程方式生成子项目。

build.sbt

ThisBuild / scalaVersion     := "2.12.8"
ThisBuild / version          := "0.1.0-SNAPSHOT"
ThisBuild / organization     := "com.example"
ThisBuild / organizationName := "example"

project / build.properties

sbt.version=1.2.8

project / SubprojectPlugin.scala

import sbt._

object SubprojectPlugin extends AutoPlugin {
  override val requires = sbt.plugins.JvmPlugin
  override val trigger = allRequirements
  override lazy val extraProjects: Seq[Project] = {
    val dirs = (file(".") * ("*" -- "project" -- "target")) filter { _.isDirectory }
    dirs.get.toList map { dir =>
      Project(dir.getName.replaceAll("""\W""", "_"), dir)
    }
  }
}

现在,如果您启动sbt,则任何未命名为targetproject的目录都将产生一个子项目。

sbt:generic-root> projects
[info] In file:/private/tmp/generic-root/
[info]   * generic-root
[info]     hello_world
[info]     robot_name
[info]     sum_of_multiple

hello-world / build.sbt

要添加更多设置,您可以在目录下创建build.sbt文件,如下所示:

libraryDependencies += "commons-io" % "commons-io" % "2.6"