Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Centos 如何使RPM在安装新软件包时不覆盖文件?_Centos_Rpm_Suse - Fatal编程技术网

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

Centos 如何使RPM在安装新软件包时不覆盖文件?,centos,rpm,suse,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/_

工程师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
经过一番研究,工程师Engelbert仍然无法找到答案。现在他正处于一个关于包装系统的激烈争论中,正如某人所说,他需要你的帮助:

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

注意-工程师Engelbert知道他应该创建更好的rpm包,并进行冲突管理,您不需要向他解释这一点。他最担心的是确保他的软件包不会与其他专有的未发布软件包在系统中的相同路径上发生冲突

注意-使用
fpm
,您可以重新生成工程师恩格尔伯特的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将覆盖*.rpm中包含的所有未标记为%config的文件,并且没有禁用该行为的选项。

--冲突是一个有用的选项否。向脚本中添加
--冲突
(如
rm-rf/my_ls/;rpm-e onemy_ls-0.0.1-1;rpm-e my_ls-0.0.1-1;rpm--conflicts-i~/my_ls\u 0.1_x86_64.rpm;ls-lh/my_ls-d;sleep 120;rpm-i--conflicts~/onemy_ls\u 0.0.1_x86_64.rpm;ls-lh/my_ls-d
)仍将覆盖这些文件,但不会出现警告。他试过了。