Python打包:在`conda``meta.yaml`文件中创建对`conda forge`包的依赖关系

Python打包:在`conda``meta.yaml`文件中创建对`conda forge`包的依赖关系,python,conda,gdal,conda-forge,conda-build,Python,Conda,Gdal,Conda Forge,Conda Build,我正在为conda forge编写一个包,需要指定对另一个conda forge依赖项的依赖项。本质上,我需要安装一个固定版本的conda forgegdal包,因为它实际上编译了支持BIGTIFF文件的libtiff 现在,如果我正在将gdal安装到conda环境中,我会编写如下代码 conda install -c conda-forge gdal=2.4.4 我希望在安装软件包时从conda forge安装此版本的gdal=2.4.4。现在在meta.yaml文件中,我可以像这样指定包

我正在为
conda forge
编写一个包,需要指定对另一个
conda forge
依赖项的依赖项。本质上,我需要安装一个固定版本的
conda forge
gdal
包,因为它实际上编译了支持BIGTIFF文件的
libtiff

现在,如果我正在将
gdal
安装到
conda
环境中,我会编写如下代码

conda install -c conda-forge gdal=2.4.4 
我希望在安装软件包时从
conda forge
安装此版本的
gdal=2.4.4
。现在在
meta.yaml
文件中,我可以像这样指定包依赖项,但是我没有看到如何指定tar文件的URL,或者其他任何可以工作的方法

{% set version = "0.0.1" %}

package:
  name: mypackage
  version: {{ version }}

source:
  url: https://github.com/myrepo/{{ version }}.tar.gz
  sha256: ****6a63

build:
  number: 1
  skip: true  # [win and py27]
  entry_points:
    - mycli = mypackage.main:main

requirements:
  build:
    - python
    - 
  host:
    - python
    - pip
    - numpy
    - gdal  # <----- want to specify from conda-forge
  run:
    - python
    - gdal  # <----- want to specify from conda-forge
{%set version=“0.0.1”%}
包裹:
姓名:mypackage
版本:{{version}
资料来源:
网址:https://github.com/myrepo/{{version}}.tar.gz
sha256:***6a63
建造:
编号:1
跳过:对#[win and py27]
入境点:
-mycli=mypackage.main:main
要求:
建造:
-蟒蛇
- 
主持人:
-蟒蛇
-皮普
-努比

-gdal#我认为不可能在
meta.yaml
中指定通道。以下问题在conda build issue tracker中仍未解决:

作为一种解决方法,如果您知道所需的
gdal
的确切版本,则可以在配方中指定确切版本和“构建字符串”

唯一恼人的是,对于配方需要支持的平台和python版本的每一种组合,您都必须列出一次
gdal

要求:
建造:
-蟒蛇
- 
主持人:
-蟒蛇
-皮普
-努比
-gdal 2.4.4 py36h02fde04#[osx和py==36]
-gdal 2.4.4 py37h622575a#[osx和py==37]
-gdal 2.4.4 py38h57202bd#[osx和py==38]
-gdal 2.4.4 py36hbb8311d#[linux和py==36]
-gdal 2.4.4 py37hf8c3989_1#[linux和py==37]
-gdal 2.4.4 py38hfe926b7#[linux和py==38]
运行:
-蟒蛇
-gdal 2.4.4 py36h02fde04#[osx和py==36]
-gdal 2.4.4 py37h622575a#[osx和py==37]
-gdal 2.4.4 py38h57202bd#[osx和py==38]
-gdal 2.4.4 py36hbb8311d#[linux和py==36]
-gdal 2.4.4 py37hf8c3989_1#[linux和py==37]
-gdal 2.4.4 py38hfe926b7#[linux和py==38]
(我是从报纸上抄的。)

顺便说一句,既然你提到了对你来说真正重要的区别是
libtiff
,那么你应该钉住
libtiff
,而不是
gdal
?或者两者兼而有之


编辑:

最好避免在
host
run
部分重复整个构建字符串列表

正如您在评论中所建议的,一个选项是在
conda\u build\u config.yaml
中定义构建字符串:

# conda_build_config.yaml
gdal_build:
  - py36h02fde04_1  # [osx and py==36]
  - py37h622575a_1  # [osx and py==37]
  - py38h57202bd_1  # [osx and py==38]
  - py36hbb8311d_1  # [linux and py==36]
  - py37hf8c3989_1  # [linux and py==37]
  - py38hfe926b7_1  # [linux and py==38]
另一个选项是直接在
meta.yaml
中定义jinja变量中的查找表。这可能有点难看,但至少所有逻辑都包含在一个文件中。我不知道该选哪个

{% set platform = 'linux' if linux else 'osx' if osx else 'win' %}

{%
  set gdal_builds = {
    'osx': {
      36: 'py36h02fde04_1',
      37: 'py37h622575a_1',
      38: 'py38h57202bd_1',
    },
    'linux': {
      36: 'py36hbb8311d_1',
      37: 'py37hf8c3989_1',
      38: 'py38hfe926b7_1',
    }
  }
%}

requirements:
  build:
    - python
    - 
  host:
    - python
    - pip
    - numpy
    - gdal  2.4.4 {{ gdal_builds[platform][py] }}

  run:
    - python
    - gdal  2.4.4 {{ gdal_builds[platform][py] }}

非常感谢你的帮助。是的,GDAL是如此敏感,以至于很难找到一个有效的构建。我可能会看看我在conda forge上使用的GDAL构建,并尝试锁定这些版本。
conda forge
版本的
gdal
上的特定版本的
libtiff
支持BIGTIFF格式——用于可能超过4GB的光栅图像。这是一个良好的开端,通常是最困难的部分。再次感谢。好吧,如果我使用实际的构建字符串,这是否意味着
conda
将通过
defaults
频道查找,而不是找到精确的构建字符串,然后它将在
conda forge
中查找精确的构建字符串,找到它,然后安装它?这就是工作的方式。只是想确保我理解。@user162094还需要将这些变量保存在
conda\u build\u config.yaml
中,然后通过变量输入,这样做有意义吗?或者最好是将它们都保存在
meta.yaml
文件中。关于这个示例的工作原理,您是正确的。它将在conda forge和defaults中搜索名称,搜索顺序取决于.condarc文件中的通道优先级。@krishnab我喜欢您的建议,即使用变量存储生成字符串。我可以想出两种方法。请看我上面的编辑。
{% set platform = 'linux' if linux else 'osx' if osx else 'win' %}

{%
  set gdal_builds = {
    'osx': {
      36: 'py36h02fde04_1',
      37: 'py37h622575a_1',
      38: 'py38h57202bd_1',
    },
    'linux': {
      36: 'py36hbb8311d_1',
      37: 'py37hf8c3989_1',
      38: 'py38hfe926b7_1',
    }
  }
%}

requirements:
  build:
    - python
    - 
  host:
    - python
    - pip
    - numpy
    - gdal  2.4.4 {{ gdal_builds[platform][py] }}

  run:
    - python
    - gdal  2.4.4 {{ gdal_builds[platform][py] }}