对如何设置多项目 sbt 项目感到困惑 [英] Confused how to set up a multi-project sbt project
问题描述
我在这里使用 sbt .13.
I'm using sbt .13 here.
到目前为止我有这个:
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)
}
这不起作用.例如,如果我进入:
This doesn't work. For example, if I go into:
项目应用模型
然后尝试编译,它说编译无效或什么的.
and try and compile, it says compile isn't valid or something.
我真的很困惑如何设置项目.正确的做法是什么?
I'm really confused how to set up a project. What is the correct way?
在此处查看第 10 号幻灯片 http://jsuereth.com/scala/2013/06/11/effective-sbt.html 它说我可以做到:
Looking at this slide #10 here http://jsuereth.com/scala/2013/06/11/effective-sbt.html it says I can do:
lazy val web = (
Project("app-models", file("app-models"))
settings(
libraryDependencies += modelDependencies
)
)
但是当我这样做时,我也会得到一个错误.
But when I do this I get an error also.
我在 sbt 里面基本上有几个项目:
I basically have a few projects inside of sbt:
common
models
services
web (which is play)
- 模型取决于共同点
- 服务依赖于公共资源 + 模型
- 网络依赖于服务
有人可以帮我让它工作吗?
Can someone help me get this to work?
推荐答案
我在您的构建定义中发现了一些问题,但是自从您购买了 Josh 的 Effective sbt 谈,我认为我们应该全力以赴.
There are a few issues I found in your build definition, but since you bought up Josh's Effective sbt talk, I think we should go whole hog on the style.
这是文件.
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)
备注
设置参数 vs 设置方法
对于models
和services
,您将设置序列传入Project(...)
构造函数,因此默认设置为可能没有加载.您可以手动传入默认设置,也可以在 Project
上使用 settings(...)
方法,我建议这样做.
notes
settings parameter vs settings method
For models
and services
, you're passing in settings sequence into Project(...)
constructor, so the default settings are likely not loaded. You can pass in the default settings manually, or use settings(...)
method on Project
, which I would recommend.
lazy val appModels = (project in file("app-models")).
settings(
libraryDependencies ++= modelDependencies
).
dependsOn(appCommon)
Josh 使用带括号的后缀表示法,但我更喜欢为此使用点表示法,因此这与演讲略有不同.
Josh uses postfix notation using parenthesis, but I prefer using dot notation for this, so that's a slight deviation from the talk.
如上例,您必须将modelDependencies
传递给libraryDependencies
.你让它直接调用settings
.
As the above example, you have to pass modelDependencies
to libraryDependencies
. You had it calling directly into settings
.
resolvers
设置没有传递给任何东西,这可能是不正确的.
The resolvers
setting is not passed into anything, which likely is not correct.
这篇关于对如何设置多项目 sbt 项目感到困惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!