安装新软件包时如何使RPM不覆盖文件?

时间:2016-08-16 15:14:25

标签: centos rpm suse

工程师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

工程师恩格尔伯特对自己的选择充满信心。他知道这可能是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

经过一项研究,工程师恩格尔伯特仍然无法找到答案。现在,他正处于一个关于包装系统的激烈争论中,而且正如某人所要求的那样,他需要你的帮助:

如何在安装新软件包时使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

1 个答案:

答案 0 :(得分:0)

是:rpm将覆盖* .rpm中包含的所有未标记为%config的文件,并且没有禁用该行为的选项。