我一直在尝试建立一个带有一些子项目的项目,但我无法让它按照我想要的方式工作。
我现在有一个Play scala主项目。我添加了两个子模块,域和基础结构。我希望一切都取决于一切。我的意思是,我的基础设施是一个scala模块,应该可以访问我的主要项目application.conf等。
我将使用我的基础设施将内容存储在数据库中,该数据库在主项目 conf-directory 中设置。
我现在有这个结构:
- Main project
- app
-controllers
-views
- conf
-evolutions
-application.conf
-routes
- domain <- scala module
- infrastructure <- scala module
- project
- public
- test
- build.sbt
我希望一切都合而为一。所有依赖项和模块都应可在所有模块中访问。
我希望能够从infrastructure
访问在 application.conf 中设置的数据库
我现在的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,以便所有模块都可以访问此项目中的所有内容?
谢谢
首先,SBT 不允许循环项目依赖,即 A -> B;B -> A. 否则它就不知道从哪里开始构建。将项目结构视为 DAG。即使循环依赖是可能的,那么将事物拆分为项目也是没有意义的,因为它们可以相互访问,使其本质上是一个项目。有时尝试将代码保存在单独的子项目中并考虑您获得的访问限制会变得有点困难。你仍然可以得到一个"菱形"项目依赖结构,尽管如果你的两个兄弟项目都依赖于其他项目:A -> C;B -> C,根 -> (A, B) 这是"精细的"。
至于项目结构,您可以在互联网或github上查看文档和许多示例。我建议转换为应该转到project
目录的Build.scala
。它将为您提供更好的控制和自定义。你可以有这样的东西:
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,无论如何)只是一个聚合项目,可以方便地构建其他所有内容。它根本不包含任何源代码或任何文件。