rpm:如何在不使用旧名称的情况下允许不触摸旧包装的无缝切换

时间:2018-10-13 02:18:14

标签: rpm rpmbuild rpm-spec

简而言之,我想在具有不同名称的新旧软件包之间实现无缝切换。但是,我想实现这一目标而不接触旧软件包的spec文件。无缝切换包括依赖新切换而不必删除并重新安装依赖于新或旧包的其他包。

例如,我要在基于Redhat的Linux发行版中添加Y。但是,发行版中早已存在软件包X。它们是同一套软件,在同一位置安装了多个文件,等等。唯一的不同是版本。 X是一个相对较旧且稳定的版本。 Y与刚刚发布的开源社区几乎相同。假设软件是Foo,X是Foo 1.4,Y是Foo 2.1。

由于Y是实验版本,我们希望允许用户无缝地在X和Y之间来回切换。换句话说,由于用户有一些依赖X或Y的软件包,我们不希望用户在从X切换到Y或从Y切换到X时必须删除并重新安装这些软件包。

问题是我想尽可能避免修改X。我可以对Y的spec文件执行任何操作,等等。

在Y上添加“过时:X”允许安装Y自动删除X,而无需接触任何其他依赖X或Y的软件包。我真的很想对X做同样的事情,但不能接触X的规格文件。 X

在Y上添加“冲突:X”会强制用户在安装X之前先“删除”Y。问题是,当用户删除Y时,所有依赖X或Y的软件包都会与Y一起消失。X不是尚未安装,Y即将消失。因此,他们既没有X也没有Y。这就是我要避免的事情。

%P.S。我在这里确实有一个类似的问题:  how to make an existing rpm obsolete a new rpm without modify the existing rpm's spec file

这是几天前的事,我所知甚少。有人建议我在Y的规格文件中使用“冲突:X”。后来,我发现了另一个问题,当我从Y切换回X时,应该删除并重新安装第三方软件包。这使我发布了这个新问题。答案确实解决了我的问题。我的旧问题的答案对我有很大帮助,但并不能完全解决我的问题。

1 个答案:

答案 0 :(得分:1)

socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, newSizeInBytes)中所述:

for(int i=0;i<metas.length;i++){
    if(metas[i].miId != null){
        filteredArr.put(metas[i]);
    }
    /*if(metas[i].getObject().miId != null){
        filteredArr.put(metas[i].getObject());
    }*/
}

如果您想回到原来的X,可以使用以下方法进行操作:

Provides: oldpackagename = $provEVR
Obsoletes: oldpackagename < $obsEVR

用您的术语:

yum swap package_to_remove package_to_install

但是,如果您的仓库中有Y,那么yum swap Y X 总是想升级到Y。

如果您想去那里并精确控制在计算机上安装的内容,我建议您选择Katello项目-如果需要支持,可以使用Red Hat Satellite。