Play Framework [2.4.x] 使用子模块

Play Framework [2.4.x] Working with Sub Modules

我一直在使用这些文档:https://www.playframework.com/documentation/2.4.x/SBTSubProjects 并将一个大项目拆分为一个主模块和一个子模块。

大约 7000 个编译器错误,大量咖啡因和整个 "wow -- wish I knew that before" 之后我让项目再次使用它的新模块化布局。

现在我想创建第二个子模块。

让我们调用主模块ROOT,我们可以子模块A ModA和子模块B ModB。

ROOT 将取决于 ModA 和 ModB

ModA 不会依赖于任何东西

ModB 将取决于 ModA

让 ModA 和 ModB 成为兄弟姐妹会更优雅(读作:可维护),还是让子模块链指示继承流程更优雅?

ROOT -> ModB -> ModA

如果(当)我们添加 ModC 和 ModD 等,这将变得更糟,所以我希望我们可以用兄弟姐妹的模型来做到这一点。

我相信大多数魔法都出现在这里:

lazy val moduleA = (project in file("modules/ModA")).enablePlugins(PlayScala)

lazy val ROOT = (project in file("."))
    .enablePlugins(PlayScala).dependsOn(ModA).aggregate(ModA)

我假设我可以链接 dependsOnaggregate 调用。

lazy val moduleA = (project in file("modules/ModA")).enablePlugins(PlayScala)

lazy val moduleB = (project in file("modules/ModB")).enablePlugins(PlayScala)

    lazy val ROOT = (project in file("."))
.enablePlugins(PlayScala).dependsOn(ModA)
.aggregate(ModA).dependsOn(ModB).aggregate(ModB)

使用兄弟模型如何声明 ModB 对 ModA 的依赖性? (假设在 ModB 的 build.sbt 中)

lazy val moduleA = (project in file("modules/ModA")).enablePlugins(PlayScala)

lazy val ROOT = (project in file("."))
    .enablePlugins(PlayScala).dependsOn(ModA).aggregate(ModA)

这应该可以正常工作:

lazy val moduleA = (project in file("modules/ModA")).enablePlugins(PlayScala)

lazy val moduleB = (project in file("modules/ModB")).enablePlugins(PlayScala).dependsOn(moduleB)

    lazy val ROOT = (project in file("."))
.enablePlugins(PlayScala).dependsOn(moduleB)

它会传递依赖于 mod A. 还要注意 dependsOn 和 aggregate 应该引用惰性 val 的名称,而不是文件夹名称。

我认为在这种情况下您实际上不需要聚合,因为您有依赖项。这是一个更复杂的例子,同时具有聚合和多重依赖关系:

lazy val moduleA = (project in file("modules/ModA")).enablePlugins(PlayScala)

lazy val moduleC = (project in file("modules/ModC")).enablePlugins(PlayScala)

lazy val moduleB = (project in file("modules/ModB")).enablePlugins(PlayScala).dependsOn(moduleB)

lazy val myapp = (project in file("myapp")).enablePlugins(PlayScala).dependsOn(moduleB, moduleC)

lazy val batch = (project in file("batch")).enablePlugins(PlayScala).dependsOn(moduleB)

lazy val ROOT = (project in file("."))
.aggregate(myapp, batch)

这样顶层(root)实际上没有代码,也不依赖于任何人,它只是聚合了你的 webapp 和它的配套批次,它们都依赖于 ModB,而 ModB 本身又依赖于 ModA