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] }}