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

问题描述

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

Tesnorflow 在 conda 上还没有一个支持 cpu 和 gpu 的包,请参阅question。相反,conda 上的 Tensorflow 是两个包,一个用于 cpu tensorflow 和 GPU tensorflow-gpu

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

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

谢谢

解决方法

假设您的配方在 CPU 和 GPU 情况下几乎相同,此用例的预期解决方案是使用 build variants 创建一个配方。

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

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

此外,该变量可以在 meta.yamlselectorsjinja templates 中使用。

在这个愚蠢的例子中,我们假设我们的包应该依赖于 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}"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...