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

时间:2013-12-14 05:52:34

标签: scala sbt rpm sbt-native-packager

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

我有一个构建标准rpm的build.sbt但是在修改目录时我很难过。我道歉 - 我对scala,sbt和本土的pacakger都很陌生。

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

我在git hub问题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
}

提前感谢任何帮助

再见 帕姆

1 个答案:

答案 0 :(得分:2)

因此,在sbt 0.12中,您需要确保在声明所需的值之前指定要使用的所有相关键。所以,让我们假装两件事:

  1. linuxPackageMappings包含了所有包装的映射。
  2. linuxPackageMappings in Rpm没有直接添加任何内容。
  3. 我们将取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(未发布)中,您可以配置默认安装位置。