使用conda-build从同一源代码构建两个具有不同需求的包



我正在处理一个使用Tensorflow的项目。要求是使用conda-build将我的代码打包为conda包。

Tesnorflow在conda上还没有一个同时支持cpu和gpu的软件包。相反,conda上的Tensorflow是两个包,一个用于CPUtensorflow和GPUtensorflow-gpu

这将迫使我为我的项目构建两个CPU和GPU包。使用conda-build而不必有两个repo,最简洁的方法是什么。

是否可以使用conda-build构建多个meta.yaml文件?

感谢

假设您的配方在CPU和GPU的情况下几乎相同,则此用例的预期解决方案是创建具有构建变体的配方。

对于您的用例,您可能不需要通读所有文档。这里有一个简单(但完整(的例子。

首先,在配方目录中创建conda_build_config.yaml,并定义一个变量,列出它可以具有的每个可能值。这指示conda-build两次构建您的配方——为您列出的每个值一次。

此外,该变量可以在meta.yaml中的选择器和jinja模板中使用。

在这个愚蠢的例子中,我们将假设我们的包应该依赖于zlibxz,但不是两者都依赖。我们将使用名为foo的变量在两者之间进行选择。

recipe/
├── build.sh
├── conda_build_config.yaml
└── meta.yaml
# recipe/conda_build_config.yaml
foo:
- bar
- baz
# recipe/meta.yaml
package:
name: mypackage-{{ foo }}
version: 0.1
requirements:
run:
- zlib  # [foo=='bar']
- xz    # [foo=='baz']

现在尝试构建配方:

conda build recipe

注意,它构建了两个";变体";。在输出接近尾声时,它会打印:

# If you want to upload package(s) to anaconda.org later, type:
anaconda upload /opt/miniconda/conda-bld/osx-64/package-bar-0.1-h11ff1f9_0.tar.bz2
anaconda upload /opt/miniconda/conda-bld/osx-64/package-baz-0.1-he38177a_0.tar.bz2

因此,在您的情况下,使用一个变量在包的cpugpu版本之间切换。在配方requirements中,使用如上所示的选择器选择所需的tensorflow的特定版本。

还要注意,您在conda_build_config.yaml中定义的变量在build.sh中可用作环境变量,以防您需要在每种情况下运行不同的构建命令。

# recipe/build.sh
echo "Now building variant: ${foo}"

相关内容

  • 没有找到相关文章

最新更新