在scala sbt中动态创建子项目



我试图在sbt中动态注册Projects:

lazy val dirs = new File("path").listFiles().filter(_.isDirectory)
val subprojects = dirs.map { p =>
Project(p.getName, p).settings(name := p.getName)
}
lazy val root = (project in file("."))
.settings(
name := "gen",
libraryDependencies ++= dependencies
)
val root2 = subprojects.foldLeft(root)((x, y) => x.aggregate(y))

但是当执行时,我得到:

在'file:/path'中没有项目'a- subproject '.

似乎项目在创建它们为Project时没有被注册:

val subprojects = dirs.map { p =>
Project(p.getName, p).settings(name := p.getName)
}

我也试过这样:

lazy val root = (project in file("."))
.aggregate(subprojects:_*)
.settings(
name := "gen",
libraryDependencies ++= dependencies
)

我:

此处不允许':_*'注释(这种注释只允许在-parameters的参数中使用).aggregate(子项目:_)

如果我在sbt上运行projects,则没有子项目列出。

如果你用下面的声明替换你的subprojects声明,它应该工作:

val subprojects = new CompositeProject {
override def componentProjects: Seq[Project] = dirs.map { p =>
Project(p.getName, p).settings(name := p.getName)
}
}

,因为它应该在CompositeProject中注册所有子项目,并允许您聚合它们

最新更新