【问题标题】:Automating the install of GFortran and Python3自动安装 GFortran 和 Python3
【发布时间】:2020-06-02 05:35:36
【问题描述】:

我想编写一个 bash 脚本,它将在新用户的 linux 机器上执行。该脚本应确保机器已准备好编译和运行多个 fortran 和 python 脚本。我的意图是检查 GCC,然后检查 GCC 中的 gfortran,然后使用自制软件安装 gfortran 公式(如果不存在)。与 python 类似,如果 python 不是最新的,我会使用 pip 安装 python3。

在开始之前,我想要一些建议。检查程序并通过幕后 bash 脚本安装它们的最佳实践是什么?有哪些注意事项?我意识到这个问题很模糊,但实际上任何建议都非常感谢。

【问题讨论】:

  • 所有 linux 发行版都预装了 homebrew、pip 和 gcc 吗?我的没有自制软件,几个月前我手动安装了 pip (软件包)
  • @CooperMaira :我将首先检查可执行文件是否已经在 PATH 中(因为用户可能已经将它们安装在某个地方)并验证版本,即检查 python3 --version。如果缺少某些东西,我会查看预期的安装位置,是否存在可执行文件。如果是,我会中止并显示用户需要更新其 PATH 设置的消息。如果它仍然丢失,我会检查brew 是否可用。如果不是,我会中止一条消息,说需要安装自制软件。否则我会运行brew
  • @oguzismail homebrew 通常不安装在 linux 机器上,但它显然是一个很棒的包管理器,因为它强调兼容性和灵活性而不是版本规范。 GCC 通常安装在 linux 机器上,但由于某种原因,即使 gfortan 在安装后安装到 gcc 中,它通常也不包含 gfortran。

标签: python linux bash installation homebrew


【解决方案1】:

考虑一种可能的不同方法。

如果您想要的软件包可以通过您正在使用的 Linux 发行版的标准软件包管理器进行安装,您可以构建一个元软件包,在安装后,它将强制安装所有组件。 (元包本身不直接包含任何软件,但它列出了包管理器在安装它时需要满足的许多依赖项。)

如果您还在包含您的元包的 http 服务器上设置了一个存储库,并将客户端上的包管理器配置为指向它,那么如果您稍后决定更新包含在标准软件套件中的所有包列表对于客户端机器,您需要做的就是将元包的新版本发布到存储库,并让客户端机器重新运行其操作系统的软件更新程序。对于元包中列出的单个软件组件,软件更新将以普通方式获取这些更新,前提是元包中的依赖信息未指定确切版本(您可以使元包依赖于>=一些版本号)。

这是基于这种方法在跨大量机器(包括计算集群的节点)设置和维护通用软件平台方面效果良好的经验——尽管在所需的软件组件是 在标准包存储库中不可用,因此需要在本地为其构建一个包并将其发布到您的存储库;然后可以将其作为要求添加到您的元包中。

以上内容是笼统的,但以本经验所基于的具体示例为例,如果客户端计算机运行 CentOS,那么您将创建一个元 RPM,该元RPM 依赖于标准存储库中的包(例如 base 和 EPEL ) 加上您需要在本地构建的任何其他 RPM,将其发布到 http 服务器上的存储库并使用 createrepo 构建必要的存储库元数据,并在客户端上的 /etc/yum.repo.d 中创建一个配置文件以指向您的存储库并运行yum install <your_meta_package>。客户端上的任何后续yum update 都会获取您推送到存储库的任何更改。 http服务器本身只是提供静态内容,所以不需要特殊配置。

对于 Ubuntu 等,您可以使用 deb 包和 APT 进行类似操作。

值得一提的是,上述内容针对的是一个相当同质的环境,其中所有客户端计算机上都使用相同的操作系统。如果您想满足更加异构的环境,那么另一种方法是使用 conda。您可以类似地维护一个包含元包的 conda 通道。

【讨论】:

  • 谢谢,我喜欢这个主意。我一直在较低的水平上与类似的想法调情。因为其中一个脚本是在 python 中并且需要用户在运行之前需要安装的几个 python 包,所以我打算让那个 python 脚本成为它自己的本地共享包,在它的设置文件中包含这些依赖项,以便自动管理它们。我喜欢将这个概念提升到一个更重要的层次的想法。
  • 元包是通过linux自然管理还是linux需要像homebrew这样的包管理器来安装元包?
  • @CooperMaira 我无法就自制软件提供建议,因为我没有使用过它,尽管它似乎可以用来管理安装在主目录中的软件包。我指的是操作系统自己的包管理器,例如 yum 或 APT,它们通常用于安装到系统路径中。当您使用这些安装包时,它们还将自动安装任何其他包以满足依赖关系。因此,如果您构建自己的包,它不提供自己的文件但列出了许多依赖项,安装它将强制安装依赖项...
  • @CooperMaira 例如,当创建一个 RPM 元包(通常使用 yum 安装)时,您可以编写一个规范文件,其中 %prep%build%install 配方是为空,%files 列表也是如此,但您有一个或多个 Requires: 标头。
  • 这也是我的想象。我也想借此机会再次感谢您的帮助。
猜你喜欢
  • 2015-11-12
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2017-01-15
相关资源
最近更新 更多