从一个sbt模块生成多个zip工件

时间:2016-09-15 15:23:00

标签: scala sbt sbt-native-packager

我有以下项目结构:

my-project/
  build.sbt
  ...
  app/
  ...
  config/
    dev/
      file1.properties
      file2.properties
    test/
      file1.properties
      file2.properties
    prod/
      file1.properties
      file2.properties

模块应用程序包含一些scala源代码并生成一个普通的jar文件。

问题在于配置模块。我需要做的是在build.sbt中创建一些配置,它将从配置中获取每个文件夹并将其内容放入一个单独的zip文件中。

结果应如下:

my-project-config-dev-1.1.zip ~>
  file1.properties
  file2.properties
my-project-config-uat-1.1.zip ~>
  file1.properties
  file2.properties
my-project-config-prod-1.1.zip ~>
  file1.properties
  file2.properties

1.1是项目的任意版本。

配置应该以这样的方式工作:当我添加新环境和新配置文件时,将生成更多的zip文件。在另一项任务中,所有这些zip文件都应发布到Nexus。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我设法通过为每个环境创建模块config然后单独的子模块来解决问题,因此项目结构看起来与所讨论的完全相同。这一切现在都在build.sbt中正确配置。

以下是我为实现我想要的目标而做的一般想法。

lazy val config = (project in file("config")).
  enablePlugins(UniversalPlugin).
  settings(
    name := "my-project",
    version := "1.1",
    publish in Universal := { },       // disable publishing of config module
    publishLocal in Universal := { }
  ).
  aggregate(configDev, configUat, configProd)

lazy val environment = settingKey[String]("Target environment")

lazy val commonSettings = makeDeploymentSettings(Universal, packageBin in Universal, "zip") ++ Seq(  // set package format
  name := "my-project-config",
  version := "1.1",
  environment := baseDirectory.value.getName,                                               // set 'environment' variable based on a configuration folder name
  topLevelDirectory := None,                                                                // set top level directory for each package
  packageName in Universal := s"my-project-config-${environment.value}-${version.value}",   // set package name (example: my-project-config-dev-1.1)
  mappings in Universal ++= contentOf(baseDirectory.value).filterNot { case (_, path) =>    // do not include target folder
    path contains "target"
  }
)

lazy val configDev = (project in file("config/dev")).enablePlugins(UniversalPlugin).settings(commonSettings: _*)
lazy val configUat = (project in file("config/uat")).enablePlugins(UniversalPlugin).settings(commonSettings: _*)
lazy val configProd = (project in file("config/prod")).enablePlugins(UniversalPlugin).settings(commonSettings: _*)

UniversalPlugin具有高度可配置性,但并非所有配置选项最初都可以清晰。我建议阅读其文档并查看源代码。

要实际打包工件,必须发出以下命令:

sbt config/universal:packageBin

出版:

sbt config/universal:publish

从上面可以看出,添加新环境非常简单 - 只需添加新文件夹和build.sbt中的一行。