Python 打包:在 `conda` `meta.yaml` 文件中创建对 `conda-forge` 包的依赖
Python Packaging: Creating a dependency on a `conda-forge` package in `conda` `meta.yaml` file
我正在为 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
文件中,我可以像这样指定包依赖项,但我没有看到如何将 URL 指定到 tar 文件,或者任何可行的方法。
{% 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
如有任何关于如何执行此操作的建议,我们将不胜感激。
我认为无法在 meta.yaml
中指定频道。以下问题在 conda-build 问题跟踪器中仍未解决:
https://github.com/conda/conda-build/issues/532
作为解决方法,如果您知道所需 gdal
的确切版本,则可以在配方中指定确切的版本和“构建字符串”。
唯一烦人的是,您必须为您的食谱需要支持的每种平台和 python 版本组合列出一次 gdal
。
requirements:
build:
- python
-
host:
- python
- pip
- numpy
- gdal 2.4.4 py36h02fde04_1 # [osx and py==36]
- gdal 2.4.4 py37h622575a_1 # [osx and py==37]
- gdal 2.4.4 py38h57202bd_1 # [osx and py==38]
- gdal 2.4.4 py36hbb8311d_1 # [linux and py==36]
- gdal 2.4.4 py37hf8c3989_1 # [linux and py==37]
- gdal 2.4.4 py38hfe926b7_1 # [linux and py==38]
run:
- python
- gdal 2.4.4 py36h02fde04_1 # [osx and py==36]
- gdal 2.4.4 py37h622575a_1 # [osx and py==37]
- gdal 2.4.4 py38h57202bd_1 # [osx and py==38]
- gdal 2.4.4 py36hbb8311d_1 # [linux and py==36]
- gdal 2.4.4 py37hf8c3989_1 # [linux and py==37]
- gdal 2.4.4 py38hfe926b7_1 # [linux and py==38]
(我从 gdal package listing on the conda-forge channel 复制了那些。)
顺便说一句,既然你提到对你来说真正重要的区别是 libtiff
,那么你应该固定 libtiff
而不是 gdal
吗?或者两者都有?
编辑:
最好避免在 host
和 run
部分重复整个构建字符串列表。
正如您在评论中所建议的,一种选择是在 conda_build_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
requirements:
build:
- python
-
host:
- python
- pip
- numpy
- gdal 2.4.4 {{ gdal_build }}
run:
- python
- gdal 2.4.4 {{ gdal_build }}
另一种选择是在 jinja 变量中直接在 meta.yaml
中定义查找 table。这可能有点丑陋,但至少所有逻辑都包含在一个文件中。我不确定该选哪个。
{% 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] }}
我正在为 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
文件中,我可以像这样指定包依赖项,但我没有看到如何将 URL 指定到 tar 文件,或者任何可行的方法。
{% 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
如有任何关于如何执行此操作的建议,我们将不胜感激。
我认为无法在 meta.yaml
中指定频道。以下问题在 conda-build 问题跟踪器中仍未解决:
https://github.com/conda/conda-build/issues/532
作为解决方法,如果您知道所需 gdal
的确切版本,则可以在配方中指定确切的版本和“构建字符串”。
唯一烦人的是,您必须为您的食谱需要支持的每种平台和 python 版本组合列出一次 gdal
。
requirements:
build:
- python
-
host:
- python
- pip
- numpy
- gdal 2.4.4 py36h02fde04_1 # [osx and py==36]
- gdal 2.4.4 py37h622575a_1 # [osx and py==37]
- gdal 2.4.4 py38h57202bd_1 # [osx and py==38]
- gdal 2.4.4 py36hbb8311d_1 # [linux and py==36]
- gdal 2.4.4 py37hf8c3989_1 # [linux and py==37]
- gdal 2.4.4 py38hfe926b7_1 # [linux and py==38]
run:
- python
- gdal 2.4.4 py36h02fde04_1 # [osx and py==36]
- gdal 2.4.4 py37h622575a_1 # [osx and py==37]
- gdal 2.4.4 py38h57202bd_1 # [osx and py==38]
- gdal 2.4.4 py36hbb8311d_1 # [linux and py==36]
- gdal 2.4.4 py37hf8c3989_1 # [linux and py==37]
- gdal 2.4.4 py38hfe926b7_1 # [linux and py==38]
(我从 gdal package listing on the conda-forge channel 复制了那些。)
顺便说一句,既然你提到对你来说真正重要的区别是 libtiff
,那么你应该固定 libtiff
而不是 gdal
吗?或者两者都有?
编辑:
最好避免在 host
和 run
部分重复整个构建字符串列表。
正如您在评论中所建议的,一种选择是在 conda_build_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
requirements:
build:
- python
-
host:
- python
- pip
- numpy
- gdal 2.4.4 {{ gdal_build }}
run:
- python
- gdal 2.4.4 {{ gdal_build }}
另一种选择是在 jinja 变量中直接在 meta.yaml
中定义查找 table。这可能有点丑陋,但至少所有逻辑都包含在一个文件中。我不确定该选哪个。
{% 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] }}