是否有一个命令行选项可以在安装时告诉apt
或yum
不安装Depends
软件包的软件包?
在 python/pip 中我可以这样做:
pip3 install --no-deps -r requirements.txt
基本原理
我们定期构建 docker 镜像。在这些文件中,我们有apt
安装未附加特定版本的软件包的说明。这个过程非常不稳定,因为——这不是我们自己的错——突然我们的测试开始崩溃。我们希望将软件包固定到其特定的、经过测试的版本。
例子:
$ sudo apt-get install python3=3.5.1-3
问题是,即使您将所需的包设置为特定版本,该包内也存在您无法控制的依赖项。这些可以随时更新,地毯将从你身下拉走。
我们希望将每个包分解为其完整的依赖项列表,然后告诉 apt/yum 仅安装该列表,不再安装其他内容。我们总是可以强迫开发人员在这些包上固定版本(特别是如果我们将它们全部放在一个文件中,例如 pip 的requirements.txt)。
答案1
这不会回答您所说的问题,但应该可以帮助您解决潜在的情况。
当需要一个版本不变的软件包源时,传统的解决方案是使用私有软件包存储库:镜像您选择的发行版的存储库,然后按原样保留它们,只部分地更改软件包。后一部分是测试中最痛苦的部分,因为与公共基础存储库相比,不同的测试场景通常最终需要不同的包升级,然后您最终需要维护多个存储库......
与映像注册表结合使用时,容器提供了更简单的解决方案。像往常一样构建基本测试映像,并包含所有测试依赖项:
FROM debian:10
RUN apt update && apt upgrade && apt install ...
构建它,并使用适当的标签(日期,如果没有更好的话)将其推送到您的(私人)注册表。然后您的测试场景可以基于该图像,该图像不会改变。当您决定需要升级特定包时,请使用新映像,并对基础映像进行适当的依赖:
FROM testbase:20200229
RUN apt update && apt install ...
仅列出您想要升级(或安装)的软件包;这样,只有那些软件包才会升级,除非它们要求在自己的依赖项中包含一个较新的包,在这种情况下,它也会被拉入(但没有简单的方法可以避免这种情况,所以无论如何你都必须处理它)。
您可以定期重建和推送基本测试映像,只要现有测试引用适当的标记映像,就不会影响现有测试。
答案2
声明依赖关系是因为无论是谁打包了这些东西,都确定在指定的版本中需要它们。当然,他们可能会做得太过分,请求不需要的东西,或者在旧版本工作正常时要求新版本。但检查每一种可能的情况需要大量工作,打包人员的时间也有限。如果合理,它们的形式将是“xyz 版本至少 5.3”,并且它应该适用于任何更高版本。
如果您不安装所请求的依赖项,您就会陷入完全未经测试的领域。它可能工作得很好,但会以神秘的方式损坏,或者就在你面前爆炸。