困惑如何设置多项目 sbt 项目

Posted

技术标签:

【中文标题】困惑如何设置多项目 sbt 项目【英文标题】:Confused how to set up a multi-project sbt project 【发布时间】: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)
模型取决于公共资源 服务取决于公共资源 + 模型 网络依赖于服务

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

【问题讨论】:

【参考方案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。请为后续问题打开新问题。 (我在回答其他问题时可能违反了 *** 准则) “我在回答其他问题时可能违反了 *** 准则” 哦,是的,你有......很多次 :-)

以上是关于困惑如何设置多项目 sbt 项目的主要内容,如果未能解决你的问题,请参考以下文章

SBT:多构建依赖/聚合项目中的覆盖设置

如何从特定项目的交叉构建的sbt多项目中删除scala版本

SBT/Play2 多项目设置在运行/测试的类路径中不包括依赖项目

如何在多项目构建中获取另一个项目的设置值

多项目 sbt 插件中未定义设置的引用

Sbt 在文件中或在多项目中的 commonSettings 中放置设置有啥区别