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] — 一个可选的 Python 测试文件,一个如果它是配方的一部分,则会自动运行的测试脚本。

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

  • 其他不包含在源代码中且无法由构建脚本生成的资源。例如,图标文件、自述文件和构建说明。

查看 定义元数据 (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。有关更多信息,请查看 源代码部分.

conda-build 放入包中的内容取决于您放入构建、主机或运行部分的内容。有关更多信息,请查看 需求部分。Conda-build 将使用此信息来识别要链接的依赖项,并识别包的运行需求。这使 conda-build 能够理解安装包需要什么。

构建#

下载完内容后,conda-build 运行构建步骤。有关更多信息,请查看 构建部分。构建步骤运行一个脚本。它可以是您提供的脚本。有关此主题的更多信息,请查看 脚本 部分。

如果您没有定义脚本部分,那么您可以创建一个 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 的引用。有关更多信息,请查看 测试部分。该文件将运行以进行测试。

输出元数据#

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

运行 conda install 会导致 conda

  1. 联系包含您要安装的包依赖项的 repodata。

  2. 确定正确的依赖项。

  3. 安装由这些依赖项确定的其他包列表。

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

有关 conda install 的更多信息,请访问 conda 文档 深入研究 页面。