Engineer Engelbert是OpenSuSE 11-sp4的忠实用户,他拥有两个内容相同的RPM包:
rpm -qlp ~/onemy_ls_0.0.1_x86_64.rpm | tee a
/.osc/_apiurl
/.osc/_files
/.osc/_meta
/.osc/_osclib_version
/.osc/_package
/.osc/_project
/my_ls/my_ls.sh
rpm -qlp ~/my_ls_0.0.1_x86_64.rpm | tee b
/.osc/_apiurl
/.osc/_files
/.osc/_meta
/.osc/_osclib_version
/.osc/_package
/.osc/_project
/my_ls/my_ls.sh
diff a b | wc
0 0 0
工程师Engelbert已经意识到他可以安装两个包而没有来自RPM的警告:
rpm -e my_ls-0.0.1-1 ; rpm -i ~/my_ls_0.0.1_x86_64.rpm
rpm -e onemy_ls-0.0.1-1 ; rpm -i ~/onemy_ls_0.0.1_x86_64.rpm
工程师Engelbert对他的选择很自信。他知道这可能是rpm开发人员的一个很好的设计选择。因此,他检查了手册页,确定会有一个不允许rpm包覆盖系统中的文件的选项。但是他找到的所有安装选项都是:
install-options
[--aid] [--allfiles] [--badreloc] [--excludepath OLDPATH]
[--excludedocs] [--force] [-h,--hash]
[--ignoresize] [--ignorearch] [--ignoreos]
[--includedocs] [--justdb] [--nodeps]
[--nodigest] [--nosignature] [--nosuggest]
[--noorder] [--noscripts] [--notriggers]
[--oldpackage] [--percent] [--prefix NEWPATH]
[--relocate OLDPATH=NEWPATH]
[--repackage] [--replacefiles] [--replacepkgs]
[--test]
他犹豫了一下,奇怪的是有--replacefiles
,却没有--keepfiles
。这表明他认为保留将是默认行为。因此,他创建了一个脚本:
rpm -e onemy_ls-0.0.1-1
rpm -e my_ls-0.0.1-1
rm -rf /my_ls/
rpm -i ~/my_ls_0.0.1_x86_64.rpm
ls -lh /my_ls -d
sleep 120
rpm -i ~/onemy_ls_0.0.1_x86_64.rpm
ls -lh /my_ls -d
显示文件实际上被覆盖了:
drwxr-xr-x 2 root root 4.0K Aug 16 17:07 /my_ls
drwxr-xr-x 2 root root 4.0K Aug 16 17:09 /my_ls
经过一番研究,工程师Engelbert仍然找不到答案。现在他正处于关于包装系统的激烈争论中,有人问他,他需要你的帮助:
如何使rpm在安装新包时不覆盖文件?
注-工程师Engelbert知道他应该用冲突管理创建更好的rpm包,你不需要解释他。他最担心的是确保他的包不会与系统中竞争相同路径的其他专有未发布包冲突。
注意-使用fpm
,你可以再生工程师Engelbert的rpm:
mkdir -p first_pkg/my_ls/
echo ls > first_pkg/my_ls/my_ls.sh
fpm -s dir -t rpm -n onemy_ls -v 0.0.1 -C first_pkg/ -p onemy_ls_VERSION_ARCH.rpm
fpm -s dir -t rpm -n my_ls -v 0.0.1 -C first_pkg/ -p my_ls_VERSION_ARCH.rpm
是:rpm将覆盖a *中包含的所有文件。