我正在尝试为具有多个依赖项的系统制作一些安装脚本,并且在进行任何实际安装之前,我已经弄清楚如何使用--dry-run
包管理器(在本例中为 Ubuntu )。apt
但是,安装软件包后,需要复制某些配置文件。在提交安装之前,我将如何检查这一点以确保目标可用?
我不想执行脚本来部分安装东西并使系统处于不可预测的状态,但如果涉及的包不存在,配置目录也不存在供我检查。
假设我想复制到base.conf
to /etc/package/system/
,但/etc/package/
根本不存在。如果目标配置错误(例如拼写错误sytem
),则在复制过程中安装包后会出错,这可能是已复制的多个配置文件之一,所以我没有办法“回滚”可以这么说。我的最终目标是安装过程不会留下部分复制的文件。
失败场景是需要复制多个文件时。如果有 3 个文件要复制,并且第 3 个文件的目标配置错误,它仍会复制前 2 个文件,并在第 3 个文件时出错。残留文件将在下次运行时导致进一步的错误。
PS:我怀疑我可能需要创建一个真正的包来处理依赖项,但所需的复杂性和时间要高得多,我现在不想投资。
答案1
您可以提前检查包的内容,甚至无需下载它们;请参阅apt-file
及其list
命令。
然而,这永远不会给你一个完整的画面,并且你无法在不安装任意包的情况下构建它所做的更改的完整画面:包可以提供执行其他更改的维护者脚本。这意味着包可以创建一个目录,而从包的元数据中看不到这一点,并且您只能通过分析维护者脚本来找到它,并考虑到它们的所有副作用以及包的依赖项的副作用。
在你的场景中,我怀疑你需要一个两阶段的方法:
- 使用包管理系统安装您需要的所有包;
- 检查您对生成的目录布局和安装的文件的所有期望,以及
- 如果满足您的期望,请将所有其他文件复制到位;
- 如果不是,请清除您安装的所有软件包(这样
--autoremove
所有自动安装的依赖项也会被删除)。