2013-12-14 57 views
2

我正在嘗試使用安裝在自定義目錄中的sbt-native-packager構建rpm包,例如/ opt/myapp而不是/ usr - 由於內部策略要求。使用sbt native-packager修改rpm的安裝目錄

我有一個build.sbt,將建立一個標準的rpm,但我很難在修改目錄。我的歉意 - 我對scala,sbt和本地pacakger都很陌生。

我正在使用mapGenericFilesToLinux並希望保留其結構 - 只是修改目標目錄的第一部分。

我發現這個代碼片段在一個Git樞紐問題https://github.com/sbt/sbt-native-packager/issues/4#issuecomment-6731183

linuxPackageMappings <+= target map { target => 
    val src = target/"webapp" 
    val dest = "/opt/app" 
    LinuxPackageMapping(
    for { 
    path <- (src ***).get 
    if !path.isDirectory 
    } yield path -> path.toString.replaceFirst(src.toString, dest) 
) 
} 

我相信,我想任何幫助

再見做同樣的事情除了

linuxPackageMappings in Rpm <++= <SOMETHING HERE> { 
    // for loop that steps through the source and destination and modifies the directory 
} 

在此先感謝 Pam

+0

sbt 0.12或0.13?如果是0.13,只需在鍵上使用'++ ='和新的'.value'。否則,我會回覆一個完整的答案。 – jsuereth

+0

感謝您的回答。它的版本是0.12.4,它被用作播放框架(v2.2.0)的一部分。 – pamduffy

回答

2

因此,在sbt 0.12您需要確保在聲明所需的值之前指定要使用的所有相關鍵。所以,讓我們假裝兩件事:

  1. linuxPackageMappings包含所有包裝的映射。
  2. linuxPackageMappings in Rpm沒有任何東西直接添加到它。

我們將採取linuxPackageMappings價值,並改變了linuxPackageMappings in Rpm目錄:

linuxPackageMappings in Rpm <<= (linuxPackageMappings) map { mappings => 
    // Let's loop through the mappings and alter their on-disc location.... 
    for(LinuxPackageMapping(filesAndNames, meta, zipped) <- mappings) yield { 
    val newFilesAndNames = for { 
     (file, installPath) <- filesAndNames 
    } yield file -> installPath.replaceFirst("/usr/share/app", "/opt/app") 
    LinuxPackageMapping(newFilesAndNames, meta, zipped) 
    } 
} 

這樣做是撕裂了的Linux軟件包映射(包括是否要gzip壓縮的文件,和用戶/組所有者/權限)並修改每個文件的安裝路徑。

希望有幫助!在sbt-native-packager.NEXT(未發佈)中,您可以配置默認安裝位置。

+0

感謝您的全面回答。當我在我的build.sbt中按照原樣嘗試代碼時,我得到以下錯誤引用最終的「LinuxPackageMapping」行。 錯誤:找不到:value newFilesAndNames – pamduffy

+0

我試圖在上面的大括號內移動這一行,所以它與val在相同的作用域,並且這種編譯後來在符號鏈接出現「File exists」錯誤時導致問題 - 我想因爲它的代碼被多次調用。我是否應該修改符號鏈接,還是應該修改第一個錯誤? – pamduffy

+0

我修正了代碼。問題是我使用<++ =而不是<< =,抱歉。你想*替換以前的linux軟件包映射。我之前列出的是*添加*到以前的。 – jsuereth