Confused how to set up a multi-project sbt project

后端 未结 1 1128
面向向阳花
面向向阳花 2020-12-13 07:05

I\'m using sbt .13 here.

I have this so far:

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

object ApplicationBuild extends Build {

  val appVers         


        
1条回答
  •  旧巷少年郎
    2020-12-13 07:15

    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.

    Effective sbt

    Here are the files.

    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)
    

    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 uses postfix notation using parenthesis, but I prefer using dot notation for this, so that's a slight deviation from the talk.

    libraryDependencies ++=

    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.

    0 讨论(0)
提交回复
热议问题