调试 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”或其他平台子目录。删除或忽略它们是安全的。