Scala 使用sbt native packager修改rpm的安装目录

Scala 使用sbt native packager修改rpm的安装目录,scala,sbt,rpm,sbt-native-packager,Scala,Sbt,Rpm,Sbt Native Packager,由于内部策略要求,我正在尝试使用sbt本机packager构建rpm包,该包安装在自定义目录中,例如/opt/myapp而不是/usr 我有一个build.sbt,它将构建一个标准rpm,但是当涉及到修改目录时,我被难住了。很抱歉,我对scala、sbt和土生土长的pacakger都很陌生 我正在使用mapGenericFilesToLinux,并希望保留其结构—只需修改目标目录的第一部分 我在git hub问题中发现了这个代码片段 linuxPackageMappings val src=ta

由于内部策略要求,我正在尝试使用sbt本机packager构建rpm包,该包安装在自定义目录中,例如/opt/myapp而不是/usr

我有一个build.sbt,它将构建一个标准rpm,但是当涉及到修改目录时,我被难住了。很抱歉,我对scala、sbt和土生土长的pacakger都很陌生

我正在使用mapGenericFilesToLinux,并希望保留其结构—只需修改目标目录的第一部分

我在git hub问题中发现了这个代码片段

linuxPackageMappings
val src=target/“webapp”
val dest=“/opt/app”
LinuxPackageMapping(
为了{
path.toString.replaceFirst(src.toString,dest)
)
}
我相信我想做一些类似的事情,除了

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

因此,在sbt 0.12中,在声明所需值之前,需要确保指定所有要使用的依赖键。那么,让我们假设两件事:

  • linuxPackageMappings
    包含打包的所有映射
  • Rpm中的linuxPackageMappings没有直接添加任何内容
  • 我们将获取
    linuxPackageMappings
    中的值,并在Rpm中更改
    linuxPackageMappings的目录:

    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) 
      }
    }
    

    Rpm sbt 0.12或0.13中的linuxPackageMappings?如果为0.13,只需在键上使用
    +=
    和新的
    .value
    。否则,我会给出完整的回答。谢谢你的回答。它是sbt版本0.12.4,它被用作play框架(v2.2.0)的一部分。感谢您的全面回答。当我尝试build.sbt中的代码时,在引用最后一行“LinuxPackageMapping”时出现以下错误。错误:找不到:value newfilesandnames我尝试将这一行移到上面的大括号内,使其与val处于同一范围内,并进行了编译,但后来在符号链接出现“File exists”错误时导致了问题-我猜是因为代码被多次调用。我是否也应该修改符号链接,或者是否应该采取其他措施来修复第一个错误?我已将代码修复为正确的。问题是我使用了我已经尝试过的这种方法,尽管rpm中的install dir已更改为所需的位置,但rpm不再打包init.d脚本。我在src/template/start中有一个对start脚本的重写,所以这可能会打破这一点。现在我的RPM没有安装,因为不知何故,target/universal/tmp/bin缺少systemv init文件。你知道怎么解决这个问题吗?
    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) 
      }
    }