【问题标题】:Play Framework project with sub-projects, how to make SBT work correctlyPlay Framework项目与子项目,如何让SBT正常工作
【发布时间】:2013-10-21 07:06:22
【问题描述】:

我从一个我一直在处理的 Play Framework 2.x 项目 (Scala) 开始。

现在已经到了我想将项目分解为多个子项目和“兄弟”项目的地步。具体来说 - 我正在编写一个 Play REST API 服务,我还希望构建一个 Javascript 项目,就像服务的“SDK”一样。

我“认为”使用 SBT 可以做到这一点 - 但我被困住了,而且该领域的文档似乎很薄。

我希望在一个“主”项目下拥有三个项目,该项目只是其他三个的容器,也是主要构建文件所在的位置。

这可能是这样的:

  • 主要
    • 服务(播放 + scala)
      • 通用文件(仅限 scala)
    • sdk (javascript)

当我尝试运行“播放”来构建我所拥有的层次结构时 - 我得到以下错误的变化:

[error] Not a valid command: play (similar: apply, last, alias)
[error] Not a valid project ID: play
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: play (similar: playConf, play-conf, playReload)
[error] play
[error]     ^

当我有一个 Build.scala(在“主”项目中)时,如下所示:

object ApplicationBuild extends Build {

val appName = "my service"
val appVersion = "1.0-SNAPSHOT"

// tell the couchbase infrastructure to use the built in logger - which will get redirected to our main logger
System.setProperty("net.spy.log.LoggerImpl", "net.spy.memcached.compat.log.SunLogger")

// project dependencies
val appDependencies = Seq(
    ...
    )

val common = Project("common", file("common"))

val service = play.Project(appName, appVersion, appDependencies, path = file("service")).settings(
        scalacOptions ++= Seq("-feature") // turn on normal warnings and feature warnings with scalac
    ).dependsOn(common)

val sdk = Project("sdk", file("sdk"))

val base = Project("base", file("."))
    .dependsOn(service)
    .dependsOn(sdk)
    .dependsOn(common)
}

我得到的文件夹层次结构是:

\
    \service
    \common
    \sdk
    \project
    \target
    build.sbt

我是否走在正确的轨道上,有人可以帮助我解决语法问题,还是我以完全错误的方式解决问题并且不能像那样使用 play? (直接使用sbt?)。

【问题讨论】:

    标签: scala playframework playframework-2.0 sbt


    【解决方案1】:

    我认为你的基础项目应该是这样的:

    val base = Project("base", file("."))
    .aggregate(service,sdk,common)
    

    【讨论】:

      【解决方案2】:

      首先,通过声明Project 类型的lazy val 来定义项目,因为您可能会遇到初始化问题。

      lazy val base = Project("base", file(".")).aggregate(sdk, service, common)
      

      如果您安装了 SBT 并为 SBT 配置了类路径,请在终端中尝试 sbt 命令。当前项目应自动设置为“base”。

      我建议您尝试使用sbt 命令而不是play 命令的原因是:如果根项目不是 PlayProject,那么play 构建脚本将失败。

      【讨论】:

        猜你喜欢
        • 2018-02-11
        • 2019-10-17
        • 2017-05-16
        • 1970-01-01
        • 2018-09-18
        • 2015-06-16
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多