sbt原生打包程序:如何创建包的变体,例如使用配置扩展



在带有sbt本机打包程序(0.7.x)的Play框架(2.3.x)Java项目中,如何创建.deb和.rpm包的特定于客户的变体?

二进制包(.deb、.zip)是使用通用设置创建的。一些客户根据自己的规范需要诸如守护程序用户名或日志位置之类的特殊功能。我想保持通用包和它们的设置不变,并添加例如一个带有一些覆盖的新配置,这样我就可以获得带有activator customer:packageBin的变体。

到目前为止,我所尝试的是创建一个新的SBT配置,extend是SBT原生打包程序的Debian配置,因此据我所知,应该继承它的设置和任务。然后我希望能够设置例如daemonUser in Customer := "custom",但在其他方面使用现有的Debian设置。

我的示例Play Java项目的build.sbtactivator newplay-java):

import NativePackagerKeys._
name := """play-java"""
version := "1.0-SNAPSHOT"
lazy val Customer = config("customer") extend(Debian)
lazy val root = (project in file("."))
    .enablePlugins(PlayJava)
    .configs(Customer)
    .settings( inConfig(Customer)(packagerSettings) : _*)
scalaVersion := "2.11.1"
libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  javaWs
)
maintainer := "Me"
packageSummary := "Example project"
packageDescription in Debian := "Longer description"
daemonUser in Customer := "custom-user"

如您所见,我现在可以设置例如daemonUser in Customer。在Play控制台中,我可以看到它正确地应用了inspect customer:daemonUser。我可以用activator customer:packageBin创建一个.deb包但是包几乎是空的,并且不包含应用程序:

$ dpkg-deb -c target/play-java_1.0-SNAPSHOT_all.deb 
drwxr-xr-x root/root         0 2014-10-06 22:08 ./
drwxr-xr-x root/root         0 2014-10-06 22:08 ./usr/
drwxr-xr-x root/root         0 2014-10-06 22:08 ./usr/share/
drwxr-xr-x root/root         0 2014-10-06 22:08 ./usr/share/play-java/
drwxr-xr-x root/root         0 2014-10-06 22:08 ./universal/
drwxr-xr-x root/root         0 2014-10-06 22:08 ./universal/tmp/
drwxr-xr-x root/root         0 2014-10-06 22:08 ./universal/tmp/bin/
-rw-r--r-- root/root        64 2014-10-06 22:08 ./universal/tmp/bin/debianprerm
-rw-r--r-- root/root       137 2014-10-06 22:08 ./universal/tmp/bin/debianpostinst
lrwxrwxrwx root/root         0 2014-10-06 22:08 ./usr/share/play-java/logs -> /var/log/play-java

每个客户的额外配置是可行的,还是没有按照我想象的方式工作?

有没有不同的方法来实现我的需求,例如子项目?

我用一种不同的方法解决了我的问题:

客户名称必须作为系统属性提供。在build.sbt内部,无论客户需要特殊设置,我都有if-then-elses。

build.sbt:

val customer = sys.props.get("customer") getOrElse ""
daemonUser in Linux := {
    customer match {
        case "customerA" => "custom-user"
        case _ => (daemonUser in Linux).value
    }
}

然后使用activator -Dcustomer=customerA debian:package-bin开始构建。

优点:

  • 一切都在一个build.sbt中。if-then-else很容易阅读,而且很清楚发生了什么
  • 您可以根据需要操作各个方面,例如要打包的文件列表

缺点:

  • 对于您需要的每个包变体,您必须多次运行构建
  • 不能保证包装内容相同,例如,如果时间戳不同

到目前为止我很高兴,但如果有人提出更好的想法,我仍然很想听。

最新更新