gpt4 book ai didi

scala - SBT 使用集合创建子项目

转载 作者:行者123 更新时间:2023-12-01 03:50:43 26 4
gpt4 key购买 nike

一段时间以来,我一直在寻找这是否可行,但收效甚微。

使用 SBT,您能否以编程方式创建子项目,而无需将每个项目明确分配给它自己的 val ?

我当前的项目结构如下所示:

root/
common/ <--- This is another sub-project that others dependOn
project/
build.scala
src/main/scala
apps/ <--- sub-projects live here
Sub1/
Sub2/
Sub1Sub2都是他们自己的 SBT 项目。

我第一次尝试将这些项目联系在一起是这样的:
// root/project/build.scala
import sbt._
import Keys._
object build extends Build {
lazy val common = project /* Pseudo-code */
val names = List("Sub1", "Sub2")
lazy val deps = names map { name =>
Project(id = name, base = file(s"apps/$name")).dependsOn(common)
}

lazy val finalDeps = common :: deps
lazy val root = project.in(file(".")).aggregate(finalDeps.map(sbt.Project.projectToRef) :_*)
.dependsOn(finalDeps.map(ClassPathDependency(_, None)) :_*)
}

但是,因为 SBT 使用反射来构建它的项目和子项目,所以这不起作用。

它仅在明确说明每个子项目时才有效:
lazy val Sub1 = project.in(file("apps/Sub1"))

所以问题是:

有没有办法在 SBT 中以编程方式构建子项目依赖项?

最佳答案

Sbt 允许为构建本身创建构建定义:

http://www.scala-sbt.org/release/docs/Getting-Started/Full-Def.html

您可以尝试创建一个包含源生成器的 project/project/build.scala 文件,如下所示:

// project/project/build.scala
sourceGenerators in Compile <+= sourceManaged in Compile map { out =>
Generator.generate(out / "generated")
}

编辑:您应该自己实现 Generator 对象。

此源生成器将依次扫描最顶层的应用程序文件夹并为包含所有子项目的对象创建源。
// project/subprojects.scala
// This is autogenerated from the source generator
object Subprojects{
lazy val Sub1 = project.in(file("apps/Sub1"))
lazy val Sub2 = project.in(file("apps/Sub2"))
lazy val all = Seq(Sub1,Sub2)
}

现在在你的主 bu​​ild.scala 中只写:
// project/build.scala
lazy val root = project.in(file("."))
.aggregate(Subprojects.all.map(sbt.Project.projectToRef) :_*)
.dependsOn(Subprojects.all.map(ClassPathDependency(_, None)) :_*)

我没有通过编译器运行所有这些,因此可能会出现一些错误,但原理应该有效。

编辑:我在 Github 上创建了一个 repo,在那里我实现了解决方案。去那里看看它是如何完成的。

https://github.com/darkocerdic/sbt-auto-subprojects

关于scala - SBT 使用集合创建子项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23158707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com