【问题标题】:Building two packages with different requirements from same source code using conda-build使用 conda-build 从相同的源代码构建两个具有不同要求的包
【发布时间】:2021-01-14 02:02:01
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: python tensorflow anaconda conda conda-build


    【解决方案1】:

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

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

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

    此外,该变量可用于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}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多