前言
前一篇文章中介绍了 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列表中,默认属性是 :