【问题标题】:RPM: replace a file with a generated one while upgradingRPM:升级时用生成的文件替换文件
【发布时间】:2015-08-30 09:50:45
【问题描述】:

通常,这根本不需要特殊操作:在%pre%post 中生成一个新文件,并在清理正在升级的 RPM 的旧内容时通过 RPM 机制删除旧文件.第一个复杂性:自动生成的文件应该与前一个文件保持相同的名称(与此无关:旧的 RPM 分散在多个客户中;技术规范要求保持名称)。如果它只是简单地生成但在%files 中不存在,则清理机制会删除生成的文件。好吧,可以在%files 中保留一个存根以防止删除。但是还有第二个复杂性:生成的文件可能与前一个文件具有相同的名称,但也可能不同(这取决于现在的环境)。有没有办法优雅地处理这种情况?

我目前的解决方案非常难看:我确实在%files 中保留了一个存根文件。如果需要更改名称,我会在 %post 中生成新文件并在同一脚本中删除旧文件。在%preun 中卸载后,如果由于名称更改而在%post 中删除它,我将再次创建已删除的文件。我这样做是为了避免出现关于尝试删除不存在文件的丑陋 RPM 警告(因为它仍列在 %files 中)。

很多不必要和不自然的工作。比如说,如果有一个选项可以在升级时动态地指示 RPM(在 %post 中)保留文件而不是删除(因为不再在 %files 中),这将使情况变得更加简单和清晰。遗憾的是,我还没有找到任何类似的选项。我真的很感激能以更好的方式处理这种情况的建议。

【问题讨论】:

    标签: linux rpm


    【解决方案1】:

    您可以在 %posttrans 部分创建该文件。

    参见https://fedoraproject.org/wiki/Packaging:ScriptletSnippets#Scriptlet_Orderinghttps://fedoraproject.org/wiki/Packaging:ScriptletSnippets#Scriptlet_Ordering上的“Scriptlets ordering”和“Save state between scriptlet”章节

    【讨论】:

    • 嗯,谢谢你的建议。这确实有效,我想我会走这条路,除非提供更好的选择。我发现这种解决方案有点不自然,因为它建议将工作转移到另一个位置/时间,而不是纠正不希望的行为(文件删除)。无论如何,分辨率看起来比我之前“自然”所做的要简单和清晰得多。我的额外并发症与使用 Maven 相关;它提供 posttransScriptlet 但在生成规范文件时丢失了 %posttrans 关键字。我必须将 %posttrans 行添加为 scriptlet 本身的第一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多