2014-10-06 61 views
0

在使用sbt-native-packager(0.7.x)的Play框架(2.3.x)Java項目中,如何創建客戶特定的.deb和.rpm包變體?sbt-native-packager:如何創建一個包的變體,例如配置擴展?

使用通用設置創建二進制包(.deb,.zip)。一些客戶根據其規格要求守護程序用戶名或日誌位置等專業。我想保留通用包和它們的設置,並添加例如有一些覆蓋的新配置,以便我可以得到activator customer:packageBin的變體。

我到目前爲止所嘗試的是創建一個新的SBT配置,其中extend是sbt-native-packager的Debian配置,因此我有限的理解應該繼承它的設置和任務。然後我希望能夠設置例如daemonUser in Customer := "custom",但以其他方式使用現有的Debian設置。

的樣片播放,Java項目(activator new>play-java)我build.sbt

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

我不太確定擴展是什麼(儘管我希望它會像你認爲的那樣:))。映射丟失。嘗試如下:客戶中的映射= =(在Debian中映射).value – Muki 2014-10-07 22:45:30

+0

@Muki不,對不起,恐怕問題會變得更深。源代碼甚至沒有編譯,所以它看起來像原始'debian:packageBin'任務的依賴關係沒有被繼承。很顯然,我誤解了'擴展'。 – hfs 2014-10-08 20:00:40

回答

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。如果然後elses很容易閱讀,並明確發生了什麼。
  • 您可以根據需要操縱每個方面,例如文件列表要打包

缺點:

  • 你必須運行構建幾次,你需要每包的變體。
  • 封面內容不保證相同,例如如果時間戳不同。

我很高興到目前爲止,但如果有人出現了一個更好的主意,我仍然希望聽到它。