使用 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 上发布