调试 conda 食谱#

食谱是你很少能在一开始就完全做对的东西。构建中总会有问题,构建会失败。也许你只在测试期间才注意到问题,但你需要比从 conda-build 中运行的测试中获得的信息更多。Conda-build 3.17.0 添加了子命令 conda debug,它旨在促进食谱调试过程。

从根本上说,调试是进入或重新创建 conda-build 在构建或测试过程中创建的环境和 shell 环境变量集的过程。这已经很长时间了——你可以观察构建输出,找出你的构建文件放在哪里,导航到那里,最后激活适当的环境。然后你可能还需要手动设置一些环境变量。

什么 conda debug 做的是为你创建环境,并提供一个你可以复制/粘贴到调试环境中的单一命令行。

用法#

conda debug 命令接受 2 种输入之一:一个食谱文件夹或一个指向已构建包的路径。

如果提供指向食谱文件夹的路径,conda debug 会创建构建和主机环境。它会提供食谱指定的任何源代码。它将构建时脚本留在工作文件夹中供你使用。完成后,conda debug 会打印类似以下内容

################################################################################
Build and/or host environments created for debugging.  To enter a debugging environment:

cd /Users/UserName/miniconda3/conda-bld/debug_1542385789430/work && source /Users/UserName/miniconda3/conda-bld/debug_1542385789430/work/build_env_setup.sh

To run your build, you might want to start with running the conda_build.sh file.
################################################################################

如果提供指向已构建包的路径,conda debug 会创建测试环境。它会准备食谱指定的任何测试文件。完成后,conda debug 会打印类似以下内容

################################################################################
Test environment created for debugging.  To enter a debugging environment:

cd /Users/UserName/miniconda3/conda-bld/conda-build_1542302975704/work && source /Users/UserName/miniconda3/conda-bld/conda-build_1542302975704/work/build_env_setup.sh

To run your tests, you might want to start with running the conda_test_runner.sh file.
################################################################################

后续步骤#

鉴于上面的输出,你现在可以进入一个环境来开始调试。从你的终端复制粘贴并进入

cd /Users/UserName/miniconda3/conda-bld/debug_1542385789430/work && source /Users/UserName/miniconda3/conda-bld/debug_1542385789430/work/build_env_setup.sh

这里你希望知道你想运行哪些构建命令来帮助你调试。每个构建都不同,所以你的体验会有所不同。但是,如果你根本不知道,你可能可以从运行适当的构建或测试脚本开始,如输出中所述。如果你这样做,请记住,这些脚本可能被编写为在出错时退出,这可能会关闭你的 shell 会话。明智的做法是仅在显式的子 shell 中运行这些脚本

bash conda_build.sh
bash conda_test_runner.sh

多个输出的复杂性#

多个输出有效地为食谱提供了许多构建阶段需要考虑。该 --output-id 参数是指定应该使用哪个参数来创建调试环境和脚本的机制。该 --output-id 参数接受 fnmatch 模式。你可以匹配输出文件名的任何部分。这实际上只适用于 conda 包,而不适用于其他输出类型,例如轮子,因为 conda-build 目前无法在不执行构建的情况下预测它们的名称。

例如,我们的 NumPy 食谱 有多个输出。如果我们想调试 NumPy-base 输出,我们将在命令中指定它,如下所示

conda debug numpy-feedstock --output-id="numpy-base*"

如果你有一个矩阵构建,你可能需要更具体

Specified --output-id matches more than one output (['/Users/msarahan/miniconda3/conda-bld/debug_1542387301945/osx-64/numpy-base-1.14.6-py27h1a60bec_4.tar.bz2', '/Users/msarahan/miniconda3/conda-bld/debug_1542387301945/osx-64/numpy-base-1.14.6-py27h8a80b8c_4.tar.bz2', '/Users/msarahan/miniconda3/conda-bld/debug_1542387301945/osx-64/numpy-base-1.14.6-py36h1a60bec_4.tar.bz2', '/Users/msarahan/miniconda3/conda-bld/debug_1542387301945/osx-64/numpy-base-1.14.6-py36h8a80b8c_4.tar.bz2', '/Users/msarahan/miniconda3/conda-bld/debug_1542387301945/osx-64/numpy-base-1.14.6-py37h1a60bec_4.tar.bz2', '/Users/msarahan/miniconda3/conda-bld/debug_1542387301945/osx-64/numpy-base-1.14.6-py37h8a80b8c_4.tar.bz2']).  Please refine your output id so that only a single output is found.

你可以通过更改你的 conda_build_config.yaml 来减少矩阵,或者创建一个更简单的矩阵并在 CLI 上传递它,或者使用 CLI 来减少它。

conda debug numpy-feedstock --output-id="numpy-base*" --python=3.6 --variants="{blas_impl: openblas}"
Specified --output-id matches more than one output (['/Users/UserName/miniconda3/conda-bld/debug_1542387443190/osx-64/numpy-base-1.14.6-py36h28eea48_4.tar.bz2', '/Users/UserName/miniconda3/conda-bld/debug_1542387443190/osx-64/numpy-base-1.14.6-py36ha711998_4.tar.bz2']).  Please refine your output id so that only a single output is found.

但是,这还不够,因为我们的矩阵包含两个 BLAS 实现,MKL 和 OpenBLAS。

进一步减少

conda debug numpy-feedstock --output-id="numpy-base*" --python=3.6 --variants="{blas_impl: 'openblas'}"

清理#

调试文件夹的命名方式是 conda build purge 命令会找到并清理这些文件夹。如果你使用 -p/--path CLI 参数,conda-build 将不会检测到这些参数,你需要手动清理。 conda build purge-all 也会删除之前构建的包。

怪癖#

你可以使用 -p/--path CLI 参数指定你希望调试内容的根目录在哪里。它的工作原理是 conda-build 将其视为它的“croot”,在该目录中,包会根据需要进行缓存,以及可能被索引。使用 --path 参数时,你可能会在指定的路径中看到“osx-64”或其他平台子目录。删除或忽略它们是安全的。