现代build.sbt指南

时间:2017-03-02 17:37:49

标签: scala sbt

这是前一个问题的延伸 trait Build in package sbt is deprecated: Use .sbt format instead

建议的清除build.sbt的指导原则是什么,以使其与最新的sbt 0.13.13(截至2017年3月)保持同步。例如:

lazy val root = Project(id = "MyProject", file("."))
  .configs(Configs.all: _*)
  .settings(
    Testing.settings,
    Docs.settings,
    name := "MyApp",
    scalaVersion := "2.11.8"
  )

parallelExecution in Test := false
scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature", "-Xlint:-missing-interpolator", "-Xfatal-warnings", "-Xlint")

assemblySettings
test in assembly := {}

libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "3.0.1" % "test",
  etc.
)

javacOptions ++= Seq("-source", "1.8", "-target", "1.8")
javaOptions in run ++= Seq(
  "-Dcom.sun.management.jmxremote=true",
  "-Dcom.sun.management.jmxremote.port=4444",
  "-Dcom.sun.management.jmxremote.authenticate=false",
  "-Dcom.sun.management.jmxremote.ssl=false"
)

// settings values for addSbtPlugin("org.flywaydb" % "flyway-sbt" % "4.0.1")
flywayUrl      := "jdbc:postgresql://localhost:5432/mydbname"
flywayUser     := "someone"
flywayPassword := "****"

Q1。 .configs(Configs.all: _*)应该更改为.configs(Configs.all)吗?

Q2。 .settings(...)内有哪些项目值得放置。相反,何时应将某些东西放在build.sbt的主体中?

Q3。 Project(id = "MyProject", ..)中使用的名称与设置键name := "MyApp"的区别是什么?这些名字在哪里使用?在SBT API中,Project.id表示id =“My Project”是“项目ID用于唯一标识构建中的项目”。但是,没有与Keys.name

相关的说明

Q4。从上面的示例中应该简化/更改的任何内容?例如,可以将各种插件的设置放在那里吗?

1 个答案:

答案 0 :(得分:1)

嗯,不是一个明确的指导方针(我怀疑有人可以指出这样的事情),但有些答案。

  1. (旧)configs的签名是:

    def configs(cs: Configuration*): Project
    

    这意味着它接受varargs作为参数 - Configs.all: _*是将Seq作为varargs参数序列传递的有效方法。如果您使用的是SBT.0.13.13,您可以根据需要进行更改,在旧版本中它会中断。

  2. 如果您使用的是root项目:

    lazy val root = Project(id = "MyProject", file("."))
    
    您放入root.settings()

    设置几乎与您直接放入build.sbt的设置相同。当您有多个模块/子项目时,前者实际上更有用:

    lazy val root = Project(id = "MyProject", file("."))
       .aggregate(a, b)
    
    lazy val a = Project(id = "A", file("modules/a"))
       .settings()
    
    lazy val b = Project(id = "B", file("modules/b"))
       .settings()
    

    就我个人而言,我会使用.settings - 仅针对多模块项目中的所有内容(为了保持一致性),而是直接在单个模块项目中的build.sbt中。

  3. 当您构建(Maven,Ivy)工件时,您会为3个名称生成名称,从而创建名称空间:组织,名称和版本。除非你改变它,否则从id复制名称。当您运行sbt(you are in project root)时,Id本身就决定了您的项目名称,这在您拥有多个模块时会产生更多不同。使用:

    lazy val root = (project in file("."))
    

    将使用将采用变量名称的宏并将其用作项目的id - 所以等于:

    lazy val root = Project(id = "root", file("."))
    
  4. 来自settings
  5. 值可以移到外面:

    Testing.settings
    Docs.settings
    name := "MyApp"
    scalaVersion := "2.11.8"
    

    除非您使用某些非标准配置,否则您应该在没有.configs()的情况下离开。在Configs.all中直接使用build.sbt很难,但如果不需要,那么你可以放弃

    lazy val root = Project(id = "MyProject", file("."))
    

    因为应用于build.sbt的所有设置都应用于同一目录(.)中的项目。

  6. 据我所知,如果它不被弃用,那就是品味问题。尝试简单地应用一些常识和良好实践 - 毕竟它只是一个代码。