1

我一直在尝试建立一个包含一些子项目的项目,但我无法让它按我的意愿工作..

我现在拥有的是一个 Play scala 主项目。我添加了两个子模块,域和基础设施。我希望一切都依赖于一切。我的意思是我的基础设施是一个 scala 模块应该可以访问我的主要项目 application.conf 等。

我将使用我的基础架构将内容存储在数据库中,该数据库设置在主项目的 conf 目录中。

我现在有这个结构:

- Main project
  - app
     -controllers
     -views
  - conf
     -evolutions
     -application.conf
     -routes
  - domain <- scala module
  - infrastructure <- scala module
  - project
  - public
  - test
  - build.sbt

我希望一切都合而为一。所有依赖项和模块都应该可以在所有模块中访问。

我希望能够访问在 application.conf 中设置的数据库infrastructure

我的 build.sbt 现在是:

name := "Main"

version := "1.0-SNAPSHOT"

play.Project.playScalaSettings

lazy val Main = project.in(file("."))

lazy val domain = project dependsOn Main

lazy val infrastructure = project dependsOn domain

libraryDependencies ++= Seq(
  anorm,
  jdbc,
  cache,
  "org.scala-tools" % "maven-scala-plugin" % "2.15.2"
)

应该如何配置我的 build.sbt 以便所有模块都可以访问该项目中的所有内容?

谢谢

4

1 回答 1

1

首先SBT不允许循环项目依赖,即A -> B;B -> A。否则它将不知道从哪里开始构建。将项目结构视为 DAG。即使循环依赖是可能的,那么将事物拆分为项目也是没有意义的,因为它们可以相互访问,使其本质上是一个项目。有时尝试将代码保存在单独的子项目中并考虑您获得的访问限制会有点困难。如果您的兄弟项目都依赖于其他项目,您仍然可以获得“钻石”项目依赖结构:A -> C;B -> C, root -> (A, B) 这是“好的”。

至于项目结构,您可以在 Internet 或 github 上查看文档和许多示例。我建议转换到Build.scala哪个应该去project目录。它将为您提供更好的控制和定制。你可以有这样的东西:

import sbt._
import Keys._

object Build extends Build {
  lazy val root = Project("root", file("."))
    .aggregate(infrastructure, domain)

  lazy val infrastructure = Project("infrastructure", file("infrastructure"))
    .settings(commonSettings)

  lazy val domain = Project("domain", file("domain"))
    .settings(commonSettings)
    .dependsOn(infrastructure)

  lazy val commonSettings =
    settings ++
    Seq(
      anorm,
      jdbc,
      cache,
      "org.scala-tools" % "maven-scala-plugin" % "2.15.2")
}

请注意,root项目(您可以将其重命名为 Main,等等)只是一个聚合项目,可以方便地构建其他所有内容。它根本不包含任何源代码或任何文件。

于 2014-02-03T14:19:48.380 回答