zypper reinstall package


#1

大牛们,你们好

我在 %postun section 中加入

if  "$1x" == "0x" ]; then
    rm ${SOMEWHERE}
fi

清理文件

但是当一个软件包被反复安装时,会出现上述位置的文件,丢失,应该是在安装时删除的,我也查了相关资料,但是我无法找到合适的 $1 的值。

我需要反复安装一个软件包,这个过程算是 upgrade 吗?


#2

没看懂,什么位置的文件丢失?somewhere 还是 $1

从我的 iPhone 发送,使用 Tapatalk


#3

不好意思,大牛,

我重说一遍,,,我想要测试一个软件包,测试它的安装、删除、升级、重装等操作。这个是出于“能打包出发行版的包不仅仅限于您和 hill 这个想法”所做出的努力。

然后我在测试,软件包重装时发现,我写的代码,会导致软件包中的文件被删除。

因为 SOMEWHERE 其实是 postinstall 脚本自己生成的文件,没有在 filelist 中出现,所以 rpm 管理程序无法将其删除,只能在 postrm 脚本中加入自己的删除脚本。然后就有了我上面的代码,

问题是这样的,但重装(reinstall)的流程貌似是
prein
postin
prerm
postrm
所以需要加上一个 if 判断,但是我晕了,在更新操作时,新旧软件包的版本号是一样的,我不确定,应该如何处理这个问题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。如此复杂的描述不知道对不对


#4
  1. 软件包重装流程是:

    preun -> uninstall -> postun -> pre-> install -> postun

  2. 你的问题不在于脚本,在于为什么你的 postinstall 脚本会生成新的文件?这么做是必须的还是不必须的?能把你的 postinstall 发上来看看嘛?


#5

不能,给你看。是必须的,你说的流程,好像是我理解的,但是,于事实,好像不一样

Sent from my iPhone using Tapatalk


#6

[emoji29]那我只能告诉你:

  1. 把 postinstall 脚本创建的文件在 %install 里 touch 出来,然后在 %files 里用 %ghost %{_bindir}/xxx 这样可以保证 rpm 卸载时卸载掉。

  2. 再用一个 shell 条件判断 somewhere 要不要删除。你写在 %postun 里的目的就是要在软件包安装完成后删除那个目录,你不再设条件这就是标准的正确的行为,跟 $1 没关系。

从我的 iPhone 发送,使用 Tapatalk


#7

[emoji29]那我只能告诉你:

  1. 把 postinstall 脚本创建的文件在 %install 里 touch 出来,然后在 %files 里用 %ghost %{_bindir}/xxx 这样可以保证 rpm 卸载时卸载掉。

  2. 再用一个 shell 条件判断 somewhere 要不要删除。你写在 %postun 里的目的就是要在软件包安装完成后删除那个目录,你不再设条件这就是标准的正确的行为,跟 $1 没关系。

从我的 iPhone 发送,使用 Tapatalk


#8

$1是有含义的,第一次,安装,升级,卸载,会给出不同的值,不过您说的,ghost我没听过,貌似能解决这种动态产生的文件的问题,

Sent from my iPhone using Tapatalk


#9

确认了下:

软件包升级的过程是先安装新包后卸载旧包,只有来自旧包的差异文件会被删除。也就是 pre -> install -> post -> preun -> uninstall -> postun 而不是前面我说的先卸载后安装。

$1 的值当然是有意义的,它代表安装在你系统上的同名软件包的版本数。比如你升级软件包,那默认是 1,但在某个状态是 2,因为这时新包装上旧包还没卸载,0 就代表这个包在你系统上已经不存在了。

从我的 iPhone 发送,使用 Tapatalk


#10

stackoverflow.com/questions/7398834/rpm-upgrade-uninstalls-the-rpm

从我的 iPhone 发送,使用 Tapatalk


#11

你这个重装有所不同,两个版本同时存在的时间没有,$1 等于 0 或 1。应该是某个时间它等于 0 所以删除了 somewhere。rpm 本身只有 install --force 没有 reinstall。判断是 zypper 的 reinstall 实现是我最早说那个,先卸载后安装,所以 $1 才有可能为 0。所以你要想保证重装 somewhere 不被移除,$1 判断是不准确的。

从我的 iPhone 发送,使用 Tapatalk


#12

我想想再回复你

Sent from my iPhone using Tapatalk


#13

使用zypper or rpm to reinstall a package , $1 will give a different value? 你是这个意思吗?

Sent from my iPhone using Tapatalk


#14

能告诉我你是怎么“重装”并且确认 $1 是变化的吗?

我实验的结果是:

  1. zypper install --force 不会触发 %postun

  2. rpm --install --replacepkgs 也不会触发

  3. rpm --reinstall 会触发 %postun,但是 $1 值依然是 1。也就是说还是用的先安装新包再删除差异文件的方式,不会为 0。

我实证的结果就是 if $1 == 0 ] ; then 只有在软件包被完全从系统上移除时才会触发。

除了上面三种方法,还剩下先卸载再安装这个重装方法,我没有测试,因为 $1 肯定为 0,somewhere 肯定会被删除。因为这就是程序的正确行为。

从我的 iPhone 发送,使用 Tapatalk


#15

我用zypper in -rf 重装,但是postun被触发了,open SUSE13.2。我肯定否则我不会注意到这个特性,不过你上述的实验结果我认为是可信的,因为我是新手所以我的实验结论没有你的可信

Sent from my iPhone using Tapatalk


#16

晚上我回家再试试你这个。

从我的 iPhone 发送,使用 Tapatalk