Conda 包规格#

Conda 包是一个包含以下内容的压缩文件:

  • info/ 目录下的元数据。

  • 直接安装到安装前缀的一组文件。

目前支持两种格式的压缩文件:

类型

描述

.tar.bz2

Conda 包的原始格式。是 conda-build 的默认输出。

.conda

第二代。更紧凑,因此速度更快。可以通过在 .condarc 文件中设置输出,从 conda-build 输出。

这些格式在所有平台和操作系统中都是相同的。在安装过程中,所有文件都会解压到安装前缀,除了 info/ 中的文件。将 conda 包安装到环境中类似于执行以下命令:

cd <environment prefix>
tar xjf some-package-1.0-0.tar.bz2

只有文件(包括符号链接)是 conda 包的一部分。目录不包含在内。目录将在需要时创建和删除,但您不能直接从 tar 压缩文件创建空目录。

包元数据#

info/ 目录包含有关包的所有元数据。此位置的文件不会安装到安装前缀。尽管您可以自由地在此目录中添加任何文件,但 conda 只检查下面讨论的文件的内容。

info/index.json#

此文件包含有关包的基本信息,例如名称、版本、构建字符串和依赖项。此文件的内容存储在 repodata.json 中,它是仓库索引文件,因此名为 index.json。JSON 对象是一个字典,包含下面显示的键。conda 包的文件名由前 3 个值组成,例如:<name>-<version>-<build>.tar.bz2<name>-<version>-<build>.conda

类型

描述

name

字符串

包的小写名称。可以包含“-”字符。

version

字符串

包版本。不能包含“-”。Conda 承认 PEP 440

build

字符串

构建字符串。不能包含“-”。区分具有相同名称和版本但构建不同的包,例如:

  • 具有其他依赖项的构建,例如 Python 3.4 而不是 Python 2.7。

  • 构建过程中的错误修复。

  • 一些不同的可选依赖项,例如 MKL 与 ATLAS 链接。Conda 中没有任何东西实际检查构建字符串。诸如 np18py34_1 之类的字符串仅用于人类可读性,Conda 从不解析它们。

build_number

整数

一个非负整数,表示包的构建号。

与构建字符串不同,build_number 会被 conda 检查。

Conda 使用它来排序具有相同名称和版本但构建不同的包,以确定最新的包。

这很重要,因为可能会将包含构建包方式错误修复的新构建添加到仓库中。

depends

字符串列表

依赖项规范列表,其中每个元素都是一个字符串,如 包匹配规范 中所述。

arch

字符串

可选。包构建的架构。

示例:x86_64

Conda 目前不使用此键。

platform

字符串

可选。包构建的操作系统。

示例:osx

Conda 目前不使用此键。

针对特定架构和平台的包通常通过包含它们的仓库子目录来区分。

请参见 仓库结构和索引

info/files#

列出所有属于包本身的文件,每行一个。所有这些文件都需要链接到环境中。包中未在此文件中列出的任何文件在安装包时都不会链接。info/files 中的文件的目录分隔符应始终为“/”,即使在 Windows 上也是如此。这与 tarball 中使用的目录分隔符相匹配。

info/has_prefix#

可选文件。列出所有包含硬编码构建前缀或占位符前缀的文件,这些前缀需要在安装时由安装前缀替换。

注意

由于二进制替换的方式,占位符前缀必须比安装前缀更长。

此文件的每一行可以是路径,在这种情况下,它被视为使用默认占位符 /opt/anaconda1anaconda2anaconda3 的文本文件,或者是一个以空格分隔的占位符、模式和路径列表,其中:

  • 占位符是构建或占位符前缀。

  • 模式是 textbinary

  • 路径是要更新的文件的相对路径。

示例:在 Windows 上

"Scripts/script1.py"
"C:\Users\username\anaconda\envs\_build" text "Scripts/script2.bat"
"C:/Users/username/anaconda/envs/_build" binary "Scripts/binary"

示例:在 macOS 或 Linux 上

bin/script.sh
/Users/username/anaconda/envs/_build binary bin/binary
/Users/username/anaconda/envs/_build text share/text

注意

相对路径的目录分隔符必须始终为“/”,即使在 Windows 上也是如此。占位符可以在 Windows 上包含“\”或“/”,但替换前缀将匹配占位符中使用的分隔符。默认占位符 /opt/anaconda1anaconda2anaconda3 是一个例外,它使用本机路径分隔符用安装前缀替换。在 Windows 上,占位符和路径始终出现在引号中,以支持包含空格的路径。

info/license.txt#

可选文件。包的软件许可证。

info/about.json#

可选文件。包含 meta.yaml 文件的 关于部分 中的条目。如果构建食谱中存在以下键,则会添加到 info/about.json 中:

  • home。

  • dev_url。

  • doc_url。

  • license_url。

  • license。

  • summary。

  • description。

  • license_family。

info/recipe#

一个包含构建食谱完整内容的目录。

meta.yaml.rendered#

完全渲染的构建食谱。请参见 conda render

仅当 构建部分 中的 include_recipe 标志为 True 时,此目录才会出现。

仓库结构和索引#

Conda 仓库(或通道)是一个目录树,通常通过 HTTPS 提供服务,它具有平台子目录,每个子目录都包含 conda 包和一个仓库索引。索引文件 repodata.json 列出平台子目录中的所有 conda 包。使用 conda index 从目录中的 conda 包创建此类索引。它只是 conda 包全名到 info/index.json 中的字典对象的映射,如 添加 pre-link、post-link 和 pre-unlink 脚本 中所述。

在以下示例中,一个仓库在 64 位 Linux 和 32 位 Windows 上提供 conda 包 misc-1.0-np17py27_0.tar.bz2

<some path>/linux-64/repodata.json
                     repodata.json.bz2
                     misc-1.0-np17py27_0.tar.bz2
           /win-32/repodata.json
                   repodata.json.bz2
                   misc-1.0-np17py27_0.tar.bz2

注意

这两个 conda 包具有相同的文件名,并且仅通过包含它们的仓库子目录来区分。

包匹配规范#

此匹配规范与在命令行中使用 conda install 的语法不同,例如 conda install python=3.4。在内部,conda 会将命令行语法转换为本节中定义的规范。

示例:python=3.4 被转换为 python 3.4.*。 conda search 'python=3.1' 不会显示 Python 3.10,只会显示 Python 3.1.*。

包依赖关系使用匹配规范指定。匹配规范是由 1、2 或 3 部分组成的空格分隔字符串。

  • 第一部分始终是包的准确名称。

  • 第二部分指的是版本,可能包含特殊字符。请参见下面的表格。

  • 第三部分始终是准确的构建字符串。当有三个部分时,第二部分必须是准确的版本。

版本特殊字符#

符号

含义

示例

<, >, <=, >=

版本上的关系运算符,使用 PEP-440 进行比较。

<=1.0 匹配 0.9、0.9.1 和 1.0,但不匹配 1.0.1。

== 和 !=

精确相等和不相等。

==0.5.1 匹配 0.5.1,而不匹配其他任何内容,而 !=0.5.1 匹配除 0.5.1 之外的所有内容。

~=

兼容性版本

~=0.5.3 等效于 >=0.5.3, <0.6.0a

|

OR

1.0|1.2 匹配版本 1.0 或 1.2。

*

匹配版本字符串中 0 个或多个字符。在正则表达式方面,它与 r'.*' 相同。

1.0|1.4* 匹配 1.0、1.4 和 1.4.1b2,但不匹配 1.2。

,

AND

>=2,<3 匹配 2 系列中的所有包。2.0、2.1 和 2.9 都匹配,但 3.0 和 1.0 不匹配。

提示

, 的优先级高于 |,因此 >=1,<2|>3 表示大于或等于 1 且小于 2 或大于 3,这将匹配 1、1.3 和 3.0,但不匹配 2.2。

注意

对于包匹配规范,也支持预发行版版本,因此 >1.0b4 将匹配 1.0b51.0rc1,但不匹配 1.0b41.0a5

Conda 通过将版本拆分为以 | 分隔的部分来解析版本。如果部分以 <、>、= 或 ! 开头,则将其解析为关系运算符。否则,将其解析为版本,可能包含 "*" 运算符。

请记住,版本规范不能包含空格,因为空格用于在整个匹配规范中分隔包、版本和构建字符串。 python >= 2.7 是一个无效的匹配规范。但是,"python >= 2.7"(带双引号或单引号)与名为 python>=2.7 的任何包的任何版本相匹配。

包规范示例#

构建字符串约束 "numpy=1.11.2=*nomkl*" 匹配不带 MKL 的 NumPy 1.11.2 包,但不匹配正常的 MKL NumPy 1.11.2 包。

构建字符串约束 "numpy=1.11.1|1.11.3=py36_0" 匹配为 Python 3.6 构建的 NumPy 1.11.1 或 1.11.3,但不匹配为 Python 3.5 或 Python 2.7 构建的 NumPy 的任何版本。

以下是 numpy-1.8.1-py27_0 的所有有效匹配规范。

  • numpy

  • numpy 1.8*

  • numpy 1.8.1

  • numpy >=1.8

  • numpy ==1.8.1

  • numpy 1.8|1.8*

  • numpy >=1.8,<2

  • numpy >=1.8,<2|1.9

  • numpy 1.8.1 py27_0

  • numpy=1.8.1=py27_0

命令行匹配规范示例#

使用命令行时,请将包含空格或以下任何字符的任何包版本规范用双引号或单引号括起来:<、>、* 或 |。

示例#

示例

含义

conda install numpy=1.11

模糊约束 numpy=1.11 匹配 1.11、1.11.0、1.11.1、1.11.2、1.11.18 等等。

conda install numpy==1.11

精确约束 numpy==1.11 匹配 1.11、1.11.0、1.11.0.0 等等。

conda install "numpy=1.11.1|1.11.3"

OR 约束 "numpy=1.11.1|1.11.3" 与 1.11.1 或 1.11.3 匹配。

conda install "numpy>1.11"

任何 numpy 版本 1.12.0a 或更高版本。

conda install "numpy>=1.8,<2"

AND 约束 "numpy>=1.8,<2" 与 1.8 和 1.9 匹配,但不匹配 2.0。