【问题标题】:Modifying install directory for rpm with sbt native-packager使用 sbt native-packager 修改 rpm 的安装目录
【发布时间】:2014-01-02 00:40:49
【问题描述】:

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

我有一个 build.sbt 可以构建一个标准的 rpm,但是在修改目录时我很难过。抱歉——我对 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
}

提前感谢您的帮助

再见 帕姆

【问题讨论】:

  • sbt 0.12 还是 0.13?如果为 0.13,只需在键上使用 ++= 和新的 .value。否则,我会回复完整的答案。
  • 感谢您的回答。它是 sbt 版本 0.12.4,它被用作游戏框架 (v2.2.0) 的一部分。

标签: scala sbt rpm sbt-native-packager


【解决方案1】:

因此,在 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(未发布)中可以配置默认安装位置。

【讨论】:

  • 感谢您的全面回答。当我在 build.sbt 中按原样尝试代码时,出现以下错误,指的是最后的“LinuxPackageMapping”行。错误:未找到:值 newFilesAndNames
  • 我尝试将这一行移到上面的大括号内,使其与 val 处于同一范围内,并且编译后在符号链接出现“文件存在”错误的情况下导致问题 - 我猜是因为该代码被多次调用。我应该修改符号链接还是应该做其他事情来修复第一个错误?
  • 我修正了代码是正确的。问题是我使用 替换以前的 linux 包映射。我之前列出的是添加到以前的。
  • 我已经尝试过这种方法,虽然 rpm 中的安装目录更改为所需位置,但 rpm 不再打包 init.d 脚本。我在我的 src/template/start 中有一个启动脚本的覆盖,所以也许这会以某种方式破坏它。现在我的 RPM 没有安装,因为不知何故 target/universal/tmp/bin 缺少 systemv-init 文件。知道如何解决这个问题吗?
猜你喜欢
  • 2015-07-25
  • 2016-12-14
  • 2016-09-15
  • 2014-01-27
  • 2018-09-29
  • 2016-05-19
  • 2017-03-21
  • 2016-11-10
  • 2016-10-24
相关资源
最近更新 更多