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