我正在构建一些 rpm 包并使用rpmlint
.这些软件包是特定于我工作地点的系统的,它们不会被推送到上游。我们的软件包包括各种软件,包括内部软件、存储库中的软件补丁版本以及官方存储库中未提供的软件。我们安装本地包/usr/local
有很多原因:
- 避免与官方包的命名冲突
- 防止
yum update
破坏本地包 - 允许本地包驻留在单独的分区或磁盘上和/或通过 NFS 共享,以便可以在主机之间共享包和配置
- 允许我们更好地控制从官方存储库之外的来源安装的软件包,其中许多不符合标准安装路径(
bin
、lib
、include
、share
等)
然而,rpmlint
当在将文件安装到/usr/local
.例如,在 GNU Hello World 的自定义构建中,rpmlint -i
必须说的是:
hello.x86_64: E: dir-or-file-in-usr-local /usr/local/hello-2.8/bin/hello
A file in the package is located in /usr/local. It's not permitted for
packages to install files in this directory.
我知道文件系统层次结构标准, 根据该:
“/usr/local”背后的最初想法是除了“/usr”之外,在每台计算机上都有一个单独的(“本地”)“/usr”目录,该目录可能只是从其他地方以只读方式安装。它复制“/usr”的结构。如今,“/usr/local”被广泛认为是保存自编译或第三方程序的好地方。 /usr/local 层次结构供系统管理员在本地安装软件时使用。当系统软件更新时,它需要确保不被覆盖。它可用于可在一组主机之间共享但在 /usr 中找不到的程序和数据。本地安装的软件必须放置在 /usr/local 而不是 /usr 中,除非安装它是为了替换或升级 /usr 中的软件。
事实上,/usr/local
出于这些原因,我们遵循这些标准并将本地软件安装到,所以我不明白为什么使用包管理器将包安装到/usr/local
.然而,我也希望我们的软件包符合标准,如果没有其他原因,除了我们本地软件包之间的一致性。那么为什么rpmlint
中的文件会抛出错误呢/usr/local
?这不应该由包装商决定吗?我可以忽略这个错误或者至少打印rpmlint
一个警告吗?
答案1
rpmlint
是一个根据某种打包策略检查 RPM 的工具。它的配置通常与发行版相关,并且根据特定的发行版策略检查包。检查你自己的包就可以了,只要这是你想要的。
如果您的策略与分发策略不同,您必须进行rpmlint
相应配置、避免使用它或忽略特定错误。
/etc/rpmlint/config
当添加到or ~/.config/rpmlint
(未测试)时,以下内容应该可以解决问题:
addFilter("E: dir-or-file-in-usr-local")
资料来源:
答案2
你没有遵循标准。/usr/local
旨在包含本地编译的文件,即在本地计算机中构建的文件。
创建包时,目标是将其分发到其他计算机。
如果您在一台计算机上安装软件包,然后在同一台计算机上从源代码构建相同的软件,如果两个目标都是/usr/local
.这是rpmlint
我们试图避免的冲突。
对于您的情况,我建议创建一个在/opt/hello2.8
.后一个目录不会与上游包或本地构建的文件冲突。