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

Posted

技术标签:

【中文标题】使用 sbt native-packager 修改 rpm 的安装目录【英文标题】:Modifying install directory for rpm with sbt native-packager 【发布时间】: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) 的一部分。 【参考方案1】:

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

    linuxPackageMappings 有你所有的包装映射。 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 文件。知道如何解决这个问题吗?

以上是关于使用 sbt native-packager 修改 rpm 的安装目录的主要内容,如果未能解决你的问题,请参考以下文章

在 sbt-native-packager 的通用包中更改名称

如何为 sbt-native-package 指定 RPM_BUILD_ROOT

使用 Sbt-native-packager 将 fat.jar + 外部文件创建到单个 tar.gz 文件中以在我的 Nexus 上发布

如何使用SBT修改默认工件的内容

sbt修改为阿里云镜像

[至逝去的一年]修改IntelliJ IDEA修改系统缓存目录,修改sbt的.sbt和.ivy2