使用SBT创建多个工件

时间:2017-02-10 23:17:58

标签: scala sbt sbt-assembly

我已经看到了这个问题的近似变体,但没有看到包含所有有用信息的答案。

使用sbt 0.13.13和sbt-assembly 0.14.3,以及基于http://www.scala-sbt.org/0.13/docs/Multi-Project.html的多项目build.sbt,如下所示:

lazy val commonSettings = Seq(
  version := "2.3.0",
  scalaVersion := "2.10.6"
)

lazy val config_jar = (project in file(".")).
  settings(commonSettings: _*).
  settings(
    name := "myapp-config",
    test in assembly := {},
    assemblyJarName in assembly := "myapp-config.jar",
    includeFilter in Compile := "myapp.conf"
  )

lazy val build_jar = (project in file(".")).
  settings(commonSettings: _*).
  settings(
    name := "myapp",
    excludeFilter in Compile := "myapp.conf",
    libraryDependencies += ...
  )

这个配置是否足以构建两个独立的罐子?什么是完整的sbt命令来构建每个命令 或者两者都来自命令行?命令sbt projects仅显示build_jar,因此缺少某些内容。

1 个答案:

答案 0 :(得分:2)

很少有评论:

  • 您的项目需要指向不同的路径。目前都指向根目录(file("."))。

  • 程序集将可用于两个项目,因此您可以从每个项目调用assembly命令。

  • 为什么要使用Scala 2.10?至少(如果您在Java 7上的混合Scala / Java项目和堆栈上说),请使用Scala 2.11.8。

  • 如果您希望一个项目对它们进行全局规则,则需要有一个聚合项目。从root用户调用assembly可以在其他两个项目的每个项目中assembly(从而创建两个罐子)。

所以我会写:

lazy val commonSettings = Seq(
  version := "2.3.0",
  scalaVersion := "2.10.6"
)

lazy val root = (project in file(".")).aggregate(config_jar, build_jar)   

lazy val config_jar = (project in file("config")).
  settings(commonSettings: _*).
  settings(
    name := "myapp-config",
    test in assembly := {},
    assemblyJarName in assembly := "myapp-config.jar",
    includeFilter in Compile := "myapp.conf"
  )

lazy val build_jar = (project in file("build")).
  dependsOn(config_jar).
  settings(commonSettings: _*).
  settings(
    name := "myapp",
    assemblyMergeStrategy in assembly := { file =>
        if(file.startsWith("config\\")) MergeStrategy.discard else MergeStrategy.defaultMergeStrategy(file)
    },
    libraryDependencies += ...
  )