【问题标题】:Playframework 2.2 with scala and sub-projects带有 scala 和子项目的 Playframework 2.2
【发布时间】:2014-02-03 12:06:54
【问题描述】:

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

我现在拥有的是一个 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

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

我希望能够从 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 以便所有模块都可以访问该项目中的所有内容?

谢谢

【问题讨论】:

    标签: scala playframework subproject


    【解决方案1】:

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

    至于项目结构,您可以查看documentation 以及 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,等等)只是一个聚合项目,可以方便地构建其他所有内容。它根本不包含任何源代码或任何文件。

    【讨论】:

    • 这是有道理的。但是,如果我希望一个模块成为其他模块需要参与的游戏框架项目。我的意思是播放模块将有一个包含数据库设置的 application.conf 文件,并且基础设施模块需要访问该数据库。我正在尝试像这样构建它,因为当我创建一个游戏项目并拥有三个不同的包时,例如(演示文稿、域、基础设施)不起作用,因为您不能或不应该修改游戏项目中的默认包。在不让它变得太复杂的情况下,您将如何做到这一点?
    • 我认为您的 Scala 代码应该能够从类路径中找到 application.conf。如果类路径设置正确,那么 application.conf 的确切位置并不重要。包名可以是任何东西并且驻留在任何项目中,您不必在项目之后命名包。最后,您可以将root 项目更改为常规项目并使用dependsOn 而不是aggregate
    猜你喜欢
    • 2012-06-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多