Как создать общий корневой проект SBT с различными подпроектами

Я работаю над треком Scala в Exercism, что означает, что у меня много проектов 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")

... но я бы не хотел добавлять каждый проект вручную. Есть ли способ автоматически добавлять новые проекты?


person uzilan    schedule 03.11.2018    source источник


Ответы (1)


Я хотел бы избежать необходимости добавлять каждый проект вручную. Есть ли способ автоматически добавлять новые проекты?

Конечно. Это немного расширенное использование sbt, но вы можете создать специальный плагин, который программно генерирует подпроекты.

build.sbt

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

проект/сборка.свойства

sbt.version=1.2.8

проект/подпроектPlugin.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, любые каталоги, не названные target или project, станут подпроектом.

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

привет-мир/build.sbt

Чтобы добавить дополнительные настройки, вы можете создать файл build.sbt в каталоге следующим образом:

libraryDependencies += "commons-io" % "commons-io" % "2.6"
person Eugene Yokota    schedule 06.01.2019
comment
Потрясающий! Сработало как шарм, когда я также добавил -- ".idea" в список игнорирования. Большое спасибо! - person uzilan; 06.01.2019
comment
Вероятно, предполагается, что подпроекты содержат каталог src, который можно добавить в качестве предиката. - person MartinGrotzke; 06.01.2019