rpm 神器第二篇-multipkg 高阶用法介绍与实战

    xiaoxiao2025-10-31  1

    前言

    前一篇文章中介绍了 multipkg 的安装和基本用法,这两天又结合之前的例子,整理了一篇类似于“实战系列”的文档, 详细说明了 rpm 中的一些细节配置在multipkg中怎么写,以便读者能通过multipkg实现rpm/spec的高阶功能;另外, 晚上总结了最近和以前的几个思路,给multipkg加了一些功能,还未合并到作者的master分支,需要使用的同学可以直接从我 的仓库来获取: git clone https://github.com/duanjigang1983/multipkg.git cd multipkg git checkout duanjigang1983 即可。 另外,examples/tskeeper 是我新加到其中的一个例子,tskeeper 的index.yaml详细展示了multipkg的配置方法,读者可以参考其写法(源代码是大概10年前 写的,如果有丑陋的地方,请包涵,因为我们的目的是为了展示multipkg的用法,并不是例子代码本身)。 下面,我们结合几个用法展开本文的内容:

    rpm 安装空目录

    为了能在 rpm 包中自带一个空目录,你需要在 spec 文件中通过这样的语法: %dir dirname 告知 rpmbuild 这个目录需要保留在rpm文件中,而在multipkg中,spec 文件被封装起来了,如果要在rpm中自带空目录, 该怎么办呢? 查看源代码可以知道,在 multipkg 中,是通过每个目录中的 “.keep”文件来实现空目录保留的。比如: root/ ├── etc │ ├── pkgaudit.conf │ └── test.conf ├── usr │ └── local │ └── pkgaudit │ ├── data │ │ └── readme.txt │ └── log │ └── readme └── var 目录 var 是一个空目录,直接: multipkg . 编译得到的 rpm 文件通过 rpm -qpl xxx.rpm 命令看到的输出列表中,不包含 "/var"这个目录,如果 : touch root/var/.keep 后,再次 multipkg 生成 rpm后,就能看到这个目录。 这个功能在multipkg的源码在文件 multipkg/source/lib/Seco/Multipkg.pm 中: 921 if ( -d _ ) { 922 print $f $rpmattr . "\%dir /$_\n" if ( -e "$path/.keep" ); 923 } 924 else { 925 print $f $rpmattr . "/$_\n"; 926 } 927 } 928 如果是一个目录,并且其中包含了 ".keep "文件,就增加 “%dir” 语法到 spec 文件中。 读者可以参考我的git fork出来multipkg的例子(branch:duanjigang1983): ls examples/tskeeper/root/usr/local/tskeeper/ -a . .. .keep 首先,你可以删除 .keep 文件后生成 rpm 包,然后 rpm -qpl xxx.rpm 查看,rpm 包中是否有该目录,应该是没有的。 然后再touch 上.keep文件,编译rpm,进行查看验证。

    requires 依赖等

    依赖包的问题,直接在 index.yaml中编写就行,比如: arch: noarch provides: - Seco::Multipkg - perl-seco-class - perl-seco-cpan requires: - perl-YAML-Syck - subversion-perl - perl-Git - perl-Error 这样的写法,当然 conflicts,provides,requires 和 obsoletes 都支持如此写法。 configfiles 和 docfiles configfiles 在 multipkg 中已经有支持,只不过原作者并未提供例子,在对代码进行分析后,我们得到了配置文件的书写语法。 如果在index.yaml中不添加files:这一项的话,所有安装的文件,multipkg都会把其添加到files列表中,默认属性是 :
    转载请注明原文地址: https://yun.8miu.com/read-142307.html
    最新回复(0)