对如何设置多项目 sbt 项目感到困惑 [英] Confused how to set up a multi-project sbt project

查看:18
本文介绍了对如何设置多项目 sbt 项目感到困惑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这里使用 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 设置方法

    对于modelsservices,您将设置序列传入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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆