SBT 使用 sbt-native-packager 如何创建不同的构建文件?

Posted

技术标签:

【中文标题】SBT 使用 sbt-native-packager 如何创建不同的构建文件?【英文标题】:SBT using sbt-native-packager how to create different build files? 【发布时间】:2015-09-01 12:13:34 【问题描述】:

我有一个 Play 2.3 应用程序,按照 docs 我可以构建一个 debian 包,当我想构建这样的东西时问题就来了:

我对@9​​87654324@ 有不同的配置,我想构建 4 个不同的包,一个包含代码,另一个包含配置。所以我会得到这4个包:

app-version.deb [this contains the code]
app-config-dev-version.deb [this contains the dev configuration]
app-config-qa-version.deb [this contains the qa configuration]
app-config-prod-version.deb‏ [this contains the prod configuration]

但是对于安装 app-version.deb,我需要其他一个作为依赖项,具体取决于机器。

machine-dev: app-version.deb and app-config-dev-version.deb
machine-qa:  app-version.deb and app-config-qa-version.deb
and so on ... 

【问题讨论】:

通常使用 debian 打包,您需要使用一组参考配置安装您的包,并使用 ansible 或 puppet 等工具来管理特定环境。 【参考方案1】:

根据我的经验,为您的应用程序配置额外的 debian 软件包并不是一个好主意。对于 play 应用程序,您还有其他更容易创建和维护的选项。

使用多个 .conf 文件

Play 使用Typesafe Config Library。为每个环境创建一个配置文件,例如

conf/
  reference.conf   # contains default settings
  dev.conf
  qa.conf
  prod.conf

现在如何定义哪一个被打包?好吧,有几个选择。

全部打包,启动时选择

全部打包并在启动时选择要使用的:

./bin/your-app -Dconfig.resource=conf/prod.conf

如果您可以控制事情的开始方式,这很简单并且有效。

全部打包并选择打包时间

您可以在构建期间通过javaOptions in Universal 添加启动命令。您可以使用Command Alias 或custom task 来做到这一点

复制并重命名特定配置

基本上你选择(例如上面的自定义任务) 配置包含为application.conf

mappings in Universal += 
  val conf = (resourceDirectory in Compile).value / "reference.conf"
  conf -> "conf/application.conf"

我不建议这样做,因为您目前不知道自己使用的是哪个软件包。

更新

使用子模块

配置/范围更复杂,有时会以意想不到的方式表现。简单的替代方法是使用子模块。

your-app/
  app
  conf
  ..
dev/
qa/
prod/

您的 build.sbt 将包含类似这样的内容

lazy val app = project
  .in(file("your-app"))
  .enabledPlugins(PlayScala)
  .settings(
     // your settings
  )

lazy val dev = project
  .in(file("dev"))
  // this one is tricky. 
  // Maybe it works when using the PlayScala Plugin
  .enabledPlugins(PlayScala)
  .settings(
    // if you only use the JavaServerAppPackaging plugin 
    // you will need to specifiy a mainclass
    //mainClass in Compile := Some("")
)

// ... rest the same way

最后你使用dev/debian:packageBin 进行开发。

【讨论】:

感谢您的解释,问题是我不想与软件包共享配置文件。我需要如何做到这一点。你能告诉我怎么做吗?所以在你的最后一个目的中,我要构建三个包 dev、prod、qa,每个包都只有一个配置文件?

以上是关于SBT 使用 sbt-native-packager 如何创建不同的构建文件?的主要内容,如果未能解决你的问题,请参考以下文章

任何使用 sbt-native-packager 的好例子

在“sbt-native-packager”脚本中使用除“sbt run”之外的其他 sbt 命令。例如:“sbt flywayMigrate”

如何使用 sbt-native-packager 设置 Docker Registry

扩展 sbt-native-packager (Docker)

如何使用 sbt-native-packager 更改通用 zip 文件名

sbt-native-packager,挂钩到 debian 包的生命周期