sbt-native-packager:如何创建包的变体,例如配置扩展?

时间:2014-10-06 20:14:13

标签: playframework sbt deb sbt-native-packager

在使用sbt-native-packager(0.7.x)的Play框架(2.3.x)Java项目中,如何创建.deb和.rpm包的客户特定变体?

使用通用设置创建二进制包(.deb,.zip)。一些客户根据其规格要求诸如守护程序用户名或日志位置之类的专业。我想保留通用软件包及其设置,并添加例如一个包含一些覆盖的新配置,以便我可以使用activator customer:packageBin获取变体。

我到目前为止尝试的是创建一个新的SBT配置extend sbt-native-packager的Debian配置,因此我的有限理解应继承其设置和任务。然后,我希望能够设置,例如daemonUser in Customer := "custom",但以其他方式使用现有的Debian设置。

我的build.sbt示例Play-Java项目(activator new> play-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

每个客户的其他配置是可行的还是不按我想象的方式工作?

是否有不同的方式来实现我需要的东西,例如:与子项目?

1 个答案:

答案 0 :(得分:1)

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

客户名称必须作为系统属性提供。在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-elses易于阅读,而且很明显发生了什么。
  • 您可以根据需要操纵每个方面,例如要打包的文件列表

缺点:

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

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