构建 RPM 以仅安装文件

2024-03-05

我需要构建一个 RPM,其唯一目的是安装一些字体。我已经阅读了一些关于此的教程,但是每个人似乎都提出了不同的建议,并且我无法找到类似非常基本的设置之类的东西来做到这一点。

是否可以只引用其中的文件%files规范部分?但是我尝试过,RMP总是尝试在tmp目录。我是否需要添加一个特定的构建步骤,将我需要的所有内容复制到tmp目录?

这些文件是否应该进入SOURCE or the BUILD构建 RPM 时的目录?我一直在寻找很多不同的信息。有些人建议构建一个包含文件的 tarball 并将其放在SOURCE目录,但这似乎有点错误,因为字体文件对我来说不是实际的源文件。

理想情况下,我想将 BUILD 文件夹中的所有字体文件放在如下目录结构下./usr/share/fonts/然后在%fileSPEC 部分并让rpm发挥它的魔力。可能我在这里遗漏或误解了一些东西。

是否%files部分总是期望在中找到源文件tmp目录,还是我的设置有问题?我创造了~/.rpmmacros其中包含

%_topdir             /Users/user/rpm

这是根构建目录,包含 BUILD、RPMS、SOURCES、SPECS 和 tmp 目录。

如果有人可以提供规范文件中最少需要的项目以使其顺利工作,我会很高兴。

Edit

根据 user3159253 的建议,我使用以下规范文件:

Name: test
Version: 1.0.0
Release: 1
Copyright: Copyright info
Group: Applications/System
BuildArch: noarch

%description
Brief description of software package.

%prep

%build

%install
mkdir -p %{buildroot}/usr/share/fonts
cp ./usr/share/fonts/* %buildroot/usr/share/fonts/

%clean

%files
/usr/share/fonts/*

我将字体复制到 BUILD/usr/share/fonts/ 目录中。如果我查询 rpm 中的文件列表,所有字体都在那里。但是,当我安装 rpm 时,它会抱怨

/usr/share/fonts is needed by test-1.0.0-1.noarch

不过,这个目录存在与否并不重要,所以我猜rpm抱怨该资源未在其数据库中列出。

我已经能够通过更改来解决这个问题%file部分至:

/usr/
/usr/share/
/usr/share/fonts/
/usr/share/fonts/*

然而,我怀疑这是否是一个好主意。有更好的方法来解决这个问题吗?


当您列出文件时%files这些文件预计位于 %{buildroot} 目录中。正如 Fedora 文档所述,自 Fedora 10 buildroot 起不能被重新定义 http://fedoraproject.org/wiki/Packaging:Guidelines#BuildRoot_tag在规范中,所以是的,您必须在 %buildroot 中创建所需的文件系统层次结构,将您的字体文件复制到那里,然后在%files:

...
%install

mkdir -p %{buildroot}/usr/share/fonts
cp /path/to/existing/MyFont.ttf %buildroot/usr/share/fonts/
...

%files
%defattr(0644, root,root)
/usr/share/fonts/*

您的发行版可能有方便的宏用于标准字体文件位置、安装 rpm 时在系统中正确注册等,但大多数这些宏都是特定于供应商的。另外,您应该将字体文件复制到 SOURCES/ 子目录中并在中提及它们Source: (Source<N>:) rpm 规范中的标签(仅作为示例,数字可以是任意数字):

Name: myfonts
Summary: my fonts package
...
Source5: MyFont.ttf
...

然后你可以在%install部分:

cp %{SOURCE5} %buildroot/usr/share/fonts/

而不是 MyFont.ttf 的完整路径。

Update: 您对缺少依赖项的看法是正确的:这不是文件系统上的工件(文件、目录等),而是 RPM 数据库中的记录(在 /var/lib/rpm 中)。因此,要解决问题,您必须使用该数据库。

因此,如果生成的 RPM 包中存在不满足的依赖关系,您有两个选择:

  1. 如果您只是希望有一种方便的方式来分发一些files无需与标准系统设施紧密集成(见下文),那么您只需关闭所有rpm自动依赖性计算。使用AutoReqProv: no完全禁用所有这些东西。
  2. 但是,您可能需要构建一个与操作系统其余部分更好集成的包。例如,字体可能需要在适当的系统设施内注册,例如fontconfig。不幸的是,不同的 Linux rpm 发行版在这方面的习惯略有不同。实际上,您必须检查在您的发行版中现有字体包中如何组织此过程。您可以获取合适的源rpm包(检查http://rpmfind.net http://rpmfind.net or http://rpm.pbone.net http://rpm.pbone.netRPM 搜索引擎),提取其 .spec 文件并研究如何%prein, %postin, %preun and %postun规范的部分已组织。显然,字体包的名称中通常带有 -fonts- :)

毕竟,您可以显示依赖关系并提供已卸载的 rpm 包rpm --query --requires --package </path/to/file.rpm> and rpm --query --provides --package </path/to/file.rpm>。安装的软件包的 deps 显示为rpm --query --requires <rpm_name>等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建 RPM 以仅安装文件 的相关文章

  • rpm方式安装 mysql5.7.29

    一 rpm方式安装 mysql5 7 29 1 下载mysql5 7 29的rpm安装包 rpm的mysql包 安装起来简单 解压版的mysql还需要做许多配置 xff0c 稍有不慎就会出错 xff01 xff01 xff01 下载地址 x
  • MySQL-手动离线安装MySQL5.7(rpm)

    说明 Linux下MySQL5 7手动离线安装 xff08 rpm xff09 包括 xff1a 安装MySQL5 7 登陆 远程访问 开机自启动 设置字符集 设置大小写规范等 MySQL版本 xff1a 5 7 36 Linux版本 xf
  • RedHat8 服务安装(编译、rpm、dnf)

    安装软件的三种方式 下载源码编译安装 可以实现自定义安装目录和参数调整可以指定版本安装在其他2个方法无法安装的情况下可以编译安装 xff08 解决兼容性 xff09 需要自己解决依赖关系 下载rpm包安装 需要下载对应系统的rpm包 xff
  • 【linux】详解linux 下安装软件tar.gz, rpm,deb的方法

    在Linux系统中 xff0c 软件安装程序比较纷繁复杂 xff0c 不过最常见的有两种 xff1a 1 xff09 一种是软件的源代码 xff0c 您需要自己动手编译它 这种软件安装包通常是用gzip压缩过的tar包 xff08 后缀为
  • 中标麒麟yum源的问题以及 mips64el.rpm和.noarch.rpm 不同 openjdk1.8安装

    1 一开始发现yum源地址不对 xff0c 访问不了 xff0c 进行了修改 ns7 adv os name 61 NeoKylin Linux Advanced Server 7 Os baseurl 61 http download c
  • 【Linux】 linux | rpm | rpm安装 | 卸载 | 升级 | 查询已安装

    rpm资源搜索 https rpmfind net linux RPM http rpm pbone net rpm安装 rpm ivh rpm卸载 rpm e rpm查询已安装 rpm qa grep rpm升级库 rpm Uvh
  • rpm与yum

    rpm与yum 前言一 应用程序与命令系统的关系二 典型应用程序的目录结构三 常见的软件封装类型四 rpm 1 概述 2 命令概述 3 查询rpm软件包信息 查询已安装的rpm软件信息 查询未安装的rpm软件包文件中的信息 安装 升级 卸载
  • 如何列出 CentOS 上已安装的软件包

    在本教程中 我们将向您展示如何列出和过滤 CentOS 上已安装的软件包 当您需要在另一台计算机上安装相同的软件包或想要重新安装系统时 了解如何列出 CentOS 系统上已安装的软件包会很有帮助 我们还将向您展示如何检查是否安装了特定的软件
  • 在基于 RHEL 的系统上配置 EPEL 存储库

    Extra Packages for Enterprise Linux EPEL 是一个在线存储库 为企业 Linux 系统提供高质量的常用软件包 这些软件包是在 Fedora 上开发和测试的 Fedora 可用于 RHEL EPEL 存储
  • 构建第一个 RPM 包的初学者指南

    如果您正在开始 Linux 世界的旅程并选择了红帽生态系统 那么您需要掌握的基本技能之一就是创建 RPM 软件包 本指南将逐步引导您完成整个过程 帮助您了解 RPM 打包以及如何构建自己的 RPM 包 即使作为初学者也是如此 什么是 RPM
  • LINUX OS ANT一键安装制作 JAVA WEB + TOMCAT7.0 RPM 安装包

    LINUX OS ANT一键安装制作 JAVA WEB TOMCAT7 0 RPM 安装包 待续
  • nginx的yum源

    nginx官方提供的yum原地址 http nginx org packages 如果使用centos7 则找到源地址 然后使用命令 sudo rpm Uvh http nginx org packages centos 7 noarch
  • 如何使 RPM 依赖于包 a 或包 b?

    这似乎是一个简单的问题 但是the docs似乎对这个问题没有什么可说的 我想做类似的事情Requires vim or emacs但当我这样做时 我实际上依赖于vim or and emacs 依赖两个包中的一个或另一个的语法是什么 执行
  • 从 Gradle 将 RPM 上传到 Artifactory

    如何使用 Gradle 将 RPM 文件上传到 Artifactory Gradle 总是使用 maven 风格的直接布局上传文件 这对于 YUM 存储库来说是不合适的 这里的问题是 Gradle 坚持以 maven 风格的目录格式上传所有
  • 配置文件的 Rpm 升级处理

    我正在使用 rpm upgrade 命令 并注意到 rpm 有不同的方式来处理修改的配置文件 因此它不会在升级过程中丢失 据我了解 如果修改了配置文件并使用 rpm U 升级了软件包 rpm 会将原始属性文件重命名为 file rpmsav
  • RPM 规范文件可以“包含”其他文件吗?

    RPM 规范中有一种 include 指令吗 我无法通过谷歌搜索找到答案 动机 我有一个 RPM 规范模板 构建过程会使用版本 修订版和其他特定于构建的数据对其进行修改 这是由sed现在 我认为如果规范会更干净 include特定于构建的定
  • RPM 的名称-版本-发布的规则是什么?

    想象一个名为abc 123 1 x86 rpm 我发现其中有一个错误 但我不知道如何命名new包裹 Maybe abc 123 2 x86 rpm 但是如果有一个怎么办xyz rpm依赖于取决于abc 123 1 Maybe abc 123
  • 在分发包中使用 virtualenv 部署 Django?

    我必须将 Django 应用程序部署到 SuSE Linux Enterprise 11 系统上 公司规则规定我只需要使用 RPM 进行部署 虽然我可以使用 setup py bdist rpm对于每个依赖项 这并不是真正明智的 因为 RP
  • 在 rpm 中将最后一个 git commit id 放在哪里

    我想将最后一个 git commit id 添加到我的 rpm 中 以便有一种万无一失的方法来追踪用于构建包的源 我可以使用 rpmrelease标签 但这已经用于快照的发行号和日期 我不想再让这个负担过重了 是否有其他标签或机制可以将最后
  • rpm-maven-plugin 参数“sourceEncoding”丢失或无效

    我正在尝试使用 rpm maven 插件 但出现以下错误 错误 无法在项目 TestRpmAndDocker 上执行目标 org codehaus mojo rpm maven plugin 2 1 3 rpm generate rpm 目

随机推荐