【问题标题】:Confused how to set up a multi-project sbt project困惑如何设置多项目 sbt 项目
【发布时间】:2014-06-05 00:12:20
【问题描述】:

我在这里使用 sbt .13。

到目前为止我有这个:

import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

  val appVersion = "1.0"

  resolvers += "local maven" at "/Users/blankman/.m2/repository/"

  val commonDependencies = Seq()
  val modelDependencies = Seq(
    "com.typesafe.slick" %% "slick" % "2.0.1",
    "org.slf4j" % "slf4j-nop" % "1.6.4"
  )

  val serviceDependencies = Seq(
    "com.typesafe.slick" %% "slick" % "2.0.1",
    "org.slf4j" % "slf4j-nop" % "1.6.4"
  )

  val webDependencies = Seq(
    //"org.apache.tomcat" % "tomcat-jdbc" % "8.0.3",
    "mysql" % "mysql-connector-java" % "5.1.30",
    "com.typesafe.slick" %% "slick" % "2.0.1"
  )


  lazy val common = Project(
    id = "app-common",
    base = file("app-common"),
    dependencies = commonDependencies
  )

  lazy val models = Project(
    id = "app-models",
    base = file("app-models"),
    settings(modelDependencies: _*)
    )
  ).dependsOn(common)

  lazy val services = Project(
    id = "app-services",
    base = file("app-services"),
    settings = Seq(
      libraryDependencies ++= serviceDependencies
    )
  ).dependsOn(models, common)


  lazy val web = play.Project("app-web", appVersion, webDependencies,
                        path = file("app-web"))
                      .settings(playScalaSettings: _*)
                      .dependsOn(services)

}

这不起作用。例如,如果我进入:

项目应用模型

并尝试编译,它说编译无效或其他什么。

我真的很困惑如何建立一个项目。正确的方法是什么?

看看这张幻灯片 #10 http://jsuereth.com/scala/2013/06/11/effective-sbt.html 它说我可以做到:

lazy val web = (
  Project("app-models", file("app-models"))
  settings(
     libraryDependencies += modelDependencies
  )
)

但是当我这样做时,我也会得到一个错误。

我在 sbt 内部基本上有几个项目:

common
models
services
web (which is play)
  • 模型取决于公共资源
  • 服务取决于公共资源 + 模型
  • 网络依赖于服务

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: scala playframework sbt


    【解决方案1】:

    我在您的构建定义中发现了一些问题,但既然您接受了 Josh 的 Effective sbt 演讲,我认为我们应该全力以赴。

    有效的 sbt

    这是文件。

    project/build.properties

    sbt.version=0.13.2
    

    project/play.sbt

    val playVersion = "2.2.2"
    
    resolvers += Resolver.typesafeRepo("releases")
    
    addSbtPlugin("com.typesafe.play" % "sbt-plugin" % playVersion) 
    

    project/commons.scala

    import sbt._
    import Keys._
    
    object Commons {
      val appVersion = "1.0"
    
      val settings: Seq[Def.Setting[_]] = Seq(
        version := appVersion,
        resolvers += Opts.resolver.mavenLocalFile
      )
    }
    

    project/dependencies.scala

    import sbt._
    import Keys._
    
    object Dependencies {
      val slickVersion = "2.0.1"
      val slick = "com.typesafe.slick" %% "slick" % slickVersion
      val slf4jVersion = "1.6.4"
      val slf4jNop = "org.slf4j" % "slf4j-nop" % slf4jVersion
      val mysqlConnectorVersion = "5.1.30"
      val mysqlConnector = "mysql" % "mysql-connector-java" % mysqlConnectorVersion
    
      val commonDependencies: Seq[ModuleID] = Seq(
        slick,
        slf4jNop
      )
      val modelDependencies: Seq[ModuleID] = Seq()
      val serviceDependencies: Seq[ModuleID] = Seq()
      val webDependencies: Seq[ModuleID] = Seq(
        mysqlConnector
      )
    }
    

    build.sbt

    import play.Project._
    import Dependencies._
    
    lazy val appCommon = (project in file("app-common")).
      settings(Commons.settings: _*).
      settings(
        libraryDependencies ++= commonDependencies
      )
    
    lazy val appModels = (project in file("app-models")).
      settings(Commons.settings: _*).
      settings(
        libraryDependencies ++= modelDependencies
      ).
      dependsOn(appCommon)
    
    lazy val appServices = (project in file("app-services")).
      settings(Commons.settings: _*).
      settings(
        libraryDependencies ++= serviceDependencies
      ).
      dependsOn(appModels, appCommon)
    
    lazy val appWeb = (project in file("app-web")).
      settings(Commons.settings: _*).
      settings(playScalaSettings: _*).
      dependsOn(appServices)
    

    注释

    设置参数与设置方法

    对于modelsservices,您将设置序列传递给Project(...) 构造函数,因此可能不会加载默认设置。您可以手动传入默认设置,或者在Project 上使用settings(...) 方法,我会推荐。

    lazy val appModels = (project in file("app-models")).
      settings(
        libraryDependencies ++= modelDependencies
      ).
      dependsOn(appCommon)
    

    Josh 使用括号后缀表示法,但我更喜欢使用点表示法,所以这与谈话略有不同。

    libraryDependencies ++=

    如上例,您必须将modelDependencies 传递给libraryDependencies。你让它直接调用settings

    解析器

    resolvers 设置没有传递给任何东西,这可能是不正确的。

    【讨论】:

    • 在我的游戏项目中,模板创建了plugins.sbt,我现在应该删除它吗?另外,你似乎在 build.sbt 中有逻辑,而我在 build.scala 中有它,有什么区别吗?
    • 另外,我也应该从公共、模型和服务项目中删除 build.sbt 吗?尤金,非常感谢!我很沮丧,因为我无法完成这项工作,并且感觉这对我来说是行不通的(play/scala),尽管我喜欢这个框架:)
    • 另外,我怎样才能使 web 项目成为默认项目?
    • 您可以删除project/plugins.sbt。 Effective sbt 谈论分解文件。 build.sbtproject/Build.scala 是一个偏好问题,但 Effective sbt 使用 build.sbt。如果您已经完成了我所做的事情,则在单个子项目中不需要build.sbt。请为后续问题打开新问题。 (我在回答其他问题时可能违反了 StackOverflow 准则)
    • “我在回答其他问题时可能违反了 StackOverflow 准则” 哦,是的,你有......很多次 :-)
    猜你喜欢
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2012-02-18
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多