0

sbt-native-packager (0.7.x) を使用する Play フレームワーク (2.3.x) Java プロジェクトで、.deb および .rpm パッケージの顧客固有のバリアントを作成するにはどうすればよいですか?

バイナリ パッケージ (.deb、.zip) は一般的な設定で作成されます。一部のお客様は、仕様に応じて、デーモンのユーザー名やログの場所などの専門分野を必要としています。一般的なパッケージとその設定をそのままにして、たとえば、いくつかのオーバーライドを含む新しい構成を追加して、 でバリアントを取得したいと思いますactivator customer:packageBin

私がこれまでに試みたのは、sbt-native-packagerextendDebian構成である新しい SBT 構成を作成することでした。したがって、私の限られた理解では、その設定とタスクを継承する必要があります。次に、たとえばを設定できるようにしたいと思いますdaemonUser in Customer := "custom"が、それ以外の場合は既存の Debian 設定を使用します。

build.sbtのサンプル Play-Java プロジェクト ( activator 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"

ご覧のとおり、eg を設定できるようになりdaemonUser in Customerました。Play コンソールでは、正しく適用されていることがわかりますinspect customer:daemonUser。で .deb パッケージを作成できますactivator customer:packageBinただし、パッケージはほとんど空で、アプリケーションは含まれていません。

$ 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

顧客ごとに構成を追加することは正しい方法ですか、それとも私が想像していたようには機能しませんか?

サブプロジェクトなど、必要なものを達成する別の方法はありますか?

4

1 に答える 1

1

別のアプローチで問題を解決しました:

顧客名は、システム プロパティとして提供する必要があります。内部build.sbtでは、顧客が特別な設定を必要とする場合は常に if-then-else を使用しています。

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ます。

利点:

  • すべてが 1 つにまとめられていbuild.sbtます。if-then-else は読みやすく、何が起こっているのかが明確です。
  • パッケージ化するファイルのリストなど、必要に応じてあらゆる側面を操作できます

短所:

  • 必要なパッケージ バリアントごとにビルドを数回実行する必要があります。
  • タイムスタンプが異なる場合など、パッケージの内容が同一であるとは限りません。

今のところ満足していますが、誰かがより良いアイデアを思い付いたら、それを聞きたいです.

于 2014-10-21T09:59:54.457 に答える