困惑如何设置多项目 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)
注释
设置参数与设置方法
对于models
和services
,您将设置序列传递给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.sbt
或 project/Build.scala
是一个偏好问题,但 Effective sbt 使用 build.sbt
。如果您已经完成了我所做的事情,则在单个子项目中不需要build.sbt
。请为后续问题打开新问题。 (我在回答其他问题时可能违反了 *** 准则)
“我在回答其他问题时可能违反了 *** 准则” 哦,是的,你有......很多次 :-)以上是关于困惑如何设置多项目 sbt 项目的主要内容,如果未能解决你的问题,请参考以下文章