Conda-build 配方#

要启用构建 conda 软件包安装和更新 conda 和 conda-build

构建 conda 软件包需要一个配方。conda-build 配方是一个扁平目录,其中包含以下文件

  • meta.yaml — 一个包含配方中所有元数据的文件。仅需要 package/namepackage/version

  • build.sh — 在 macOS 和 Linux 上安装软件包文件的脚本。它使用 bash 命令执行。

  • bld.bat — 在 Windows 上安装软件包文件的构建脚本。它使用 cmd 执行。

  • run_test.[py,pl,sh,bat,r] — 一个可选的 Python 测试文件,如果它是配方的一部分,则会自动运行的测试脚本。

  • 应用于源代码的可选补丁。

  • 未包含在源代码中且无法由构建脚本生成的其他资源。例如,图标文件、readme 文件和构建注释。

查看 定义元数据 (meta.yaml) 以了解配方组件的详细信息,包括

  • 软件包名称

  • 软件包版本

  • 描述性元数据

  • 在哪里获取源代码

  • 如何测试软件包

提示

当您使用 conda skeleton 命令时,前 3 个文件 — meta.yamlbuild.shbld.bat — 会自动为您生成。

Conda-build 过程#

Conda-build 执行以下步骤

  1. 读取元数据。

  2. 将源代码下载到缓存中。

  3. 将源代码提取到源目录中。

  4. 应用任何补丁。

  5. 如果需要源代码来填充任何元数据值,则重新评估元数据。

  6. 创建一个构建环境,然后在其中安装构建依赖项。

  7. 运行构建脚本。当前工作目录是设置了环境变量的源目录。构建脚本安装到构建环境中。

  8. 执行一些必要的后处理步骤,例如添加 shebang 和 rpath

  9. 创建一个 conda 软件包,其中包含构建环境中从步骤 5 开始的所有新文件,以及必要的 conda 软件包元数据。

  10. 测试新的 conda 软件包 — 如果配方包含测试 — 通过执行以下操作

    • 删除构建环境和源目录,以确保新的 conda 软件包不会意外地依赖于未包含在软件包中的工件。

    • 创建一个包含软件包及其依赖项的测试环境。

    • 运行测试脚本。

存档的 conda-recipes 仓库、AnacondaRecipes 聚合仓库和 conda-forge feedstocks 仓库包含许多 conda 软件包的示例配方。

注意

所有配方文件,包括 meta.yaml 和构建脚本,都包含在最终软件包归档文件中,该文件将分发给用户。请注意不要将密码等敏感信息放入配方中,以免公开。

conda skeleton 命令可以帮助为常见仓库(如 PyPI)制作骨架配方。

深入了解#

让我们仔细看看 conda-build 如何使用配方来创建软件包。

模板#

当您构建 conda 软件包时,conda-build 通过读取 meta.yaml 中的模板来渲染软件包。请参阅 使用 Jinja 进行模板化

模板使用您的 conda build config 填充,它显示了要构建的内容的矩阵。conda build config 确定它必须执行多少次构建。例如,定义 conda_build_config.yaml 的形式并填充它定义了一个包含 4 个软件包的构建矩阵

foo:
  - 1.0
  - 2.0
bar:
  - 1.2.0
  - 1.4.0

之后,conda-build 确定输出将是什么。例如,如果您的 conda build config 指示您想要 2 个不同版本的 Python,conda-build 将向您显示每个 Python 版本的渲染结果。

环境#

为了构建软件包,conda-build 将为您创建一个环境,并在该环境中安装所有构建和运行依赖项。Conda-build 将指示您可以在哪里成功构建软件包。前缀将采用以下形式

<file path to conda>/conda-bld/<package name and string>/h_env_placeholder…

Conda-build 下载您的软件包源代码,然后在构建环境的上下文中构建 conda 软件包。例如,您可以指示它从 Git 仓库下载或从另一个来源拉取 tarball。有关更多信息,请参阅Source section

conda-build 放入软件包的内容取决于您放入 build、host 或 run 部分的内容。有关更多信息,请参阅 Requirements section。Conda-build 将使用此信息来识别要链接到的依赖项并识别软件包的运行要求。这使 conda-build 能够了解安装软件包所需的条件。

构建#

下载内容后,conda-build 运行构建步骤。有关更多信息,请参阅 Build section。构建步骤运行一个脚本。它可以是您提供的脚本。有关此主题的更多信息,请参阅 Script section。

如果您未定义 script 部分,则可以创建要运行的 build.shbld.bat 文件。

前缀替换#

构建环境在占位符前缀中创建。当软件包捆绑在一起时,前缀设置为“虚拟”前缀。一旦 conda 准备好安装软件包,它就会用最终前缀重写虚拟前缀。

测试#

构建软件包后,conda-build 能够对其进行测试。为此,它会创建另一个环境并安装 conda 软件包。此前缀的形式为

<file path to conda>/conda-bld/<package name + string>/_test_env_placeholder…

此时,conda-build 拥有来自 meta.yaml 的所有关于其运行时依赖项的信息,因此这些依赖项也会被安装。这将生成一个测试运行器脚本,其中引用了创建的测试 meta.yaml。有关更多信息,请参阅 Test section。该文件用于测试。

输出元数据#

在构建和测试软件包后,conda-build 清理先前步骤中创建的环境并输出元数据。软件包的配方也添加到输出元数据中。元数据目录位于 info 目录中软件包内容的顶层。元数据包含有关软件包依赖项的信息以及软件包中所有文件在安装时所处位置的列表。当 conda 需要安装时,它会读取该元数据。

运行 conda install 会导致 conda 执行以下操作

  1. 访问包含您正在安装的软件包的依赖项的 repodata。

  2. 确定正确的依赖项。

  3. 安装由这些依赖项确定的一系列附加软件包。

  4. 对于正在安装的每个依赖软件包:#. 解压 tarball 以查看其中包含的信息。#. 根据软件包中的元数据验证文件。#. 遍历软件包中的每个文件并将其放在正确的位置。

有关 conda install 的更多信息,请访问 conda 文档中关于该主题的 deep dive 页面。