I'm using sbt .13 here.
I have this so far:
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:
project app-models
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?
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.
I basically have a few projects inside of sbt:
common models services web (which is play)
Can someone help me get this to work?
sbt is a popular tool for compiling, running, and testing Scala projects of any size. Using a build tool such as sbt (or Maven/Gradle) becomes essential once you create projects with dependencies or more than one code file.
Delegate a Scala project build to sbtPress Ctrl+Alt+S to open the IDE settings and select Build, Execution, Deployment | Build Tools | sbt. In the sbt projects section, select a project for which you want to configure build actions. In the sbt shell section, select the builds option. Click OK to save the changes.
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.
Here are the files.
sbt.version=0.13.2
val playVersion = "2.2.2" resolvers += Resolver.typesafeRepo("releases") addSbtPlugin("com.typesafe.play" % "sbt-plugin" % playVersion)
import sbt._ import Keys._ object Commons { val appVersion = "1.0" val settings: Seq[Def.Setting[_]] = Seq( version := appVersion, resolvers += Opts.resolver.mavenLocalFile ) }
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 ) }
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)
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 uses postfix notation using parenthesis, but I prefer using dot notation for this, so that's a slight deviation from the talk.
As the above example, you have to pass modelDependencies
to libraryDependencies
. You had it calling directly into settings
.
The resolvers
setting is not passed into anything, which likely is not correct.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With