我在 Linux 发行版(通常是 Debian 变体和 Red Hat 变体)上使用许多科学软件。为了最大限度地提高性能并获得最新功能,通常最好从源代码编译软件。
然而,这样做很混乱,并且可能导致与包管理器的冲突。我查看了中的所有建议Unix & Linux 问题“如何从源代码编译和安装程序”和Unix & Linux 问题“我自己编译的软件应该放在哪里?”寻求一些指导。这些问题是一个很好的起点,但我不清楚如何轻松管理依赖关系。例如,如果我构建开发分支数值模拟从源头使用类似的东西检查安装,我应该如何检测依赖关系,以便我可以将它们正确添加到 CheckInstall 构建的包中?我的目标是使安装和卸载软件相对轻松,而不会使我的配置混乱。
我还想让我的配置可重复。我的意思是,我想建立一个在我的机器上安装软件的工作流程,以便我可以在新的操作系统安装上准确地重复它。有没有最佳实践?当涉及到包管理器中的标准包时,重复软件安装的最简单方法是创建一个包含适当包的脚本。
apt-get 安装 <包装>(或同等内容)。然而,当从源代码安装软件时,我发现这种方法变得非常复杂。有没有更好的办法?
答案1
正确的方法是构建该软件的软件包(RPM/Deb)并且只安装软件包。这是与包管理器正确集成并正确处理依赖关系的唯一方法。我建议您了解 RPM/Deb 是如何构建的,然后找到该软件的现有软件包作为您的软件包的基础。
Python 模块可以在系统范围内打包和安装,并且通常与 virtualenvs 一起使用(除非您使用的是--no-site-packages
)。但这是否比直接安装到 virtualenv 更好pip
尚不清楚。软件包重量更重,但 virtualenv 安装的可重复性往往较低,因为新版本可能会让您感到惊讶。
要定义组成系统的软件包列表,我建议创建一个元包,这是一个不包含文件但有依赖项的包。该元包将依赖于所有必需的包(您自己构建的包以及上游包)。安装新系统只需安装此元包即可。