Conda 包规范#
Conda 包是一个归档文件,包含
位于
info/
目录下的元数据。直接安装到安装前缀中的文件集合。
目前支持两种归档文件格式
类型 |
描述 |
.tar.bz2 |
Conda 包的原始格式。 |
.conda |
第二代。这种格式更紧凑,因此速度更快。自 25.1 版本以来的默认格式。 |
这些格式在平台和操作系统之间是相同的。在安装过程中,所有文件都会被提取到安装前缀中,除了 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 |
字符串 |
构建字符串。可能不包含“-”。区分具有相同名称和版本的包的不同构建,例如
|
build_number |
整数 |
表示包的构建号的非负整数。 与构建字符串不同, Conda 使用它来对具有相同名称和版本的包进行排序,以确定最新的包。 这很重要,因为可能将包含包构建方式的错误修复的新构建添加到存储库。 |
depends |
字符串列表 |
依赖项规范列表,其中每个元素都是一个字符串,如包匹配规范中所述。 |
arch |
字符串 |
可选。包构建所针对的架构。 示例: Conda 目前不使用此键。 |
platform |
字符串 |
可选。包构建所针对的操作系统。 示例: Conda 目前不使用此键。 特定架构和平台的包通常通过包含它们的存储库子目录来区分。 请参阅存储库结构和索引。 |
info/files#
列出作为包本身一部分的所有文件,每行 1 个文件。所有这些文件都需要链接到环境中。包中未在此文件中列出的任何文件在安装包时都不会链接。info/files
中文件的目录分隔符应始终为“/”,即使在 Windows 上也是如此。这与 tarball 中使用的目录分隔符相匹配。
info/has_prefix#
可选文件。列出所有包含硬编码的构建前缀或占位符前缀的文件,这些前缀需要在安装时替换为安装前缀。
注意
由于二进制替换的工作方式,占位符前缀必须比安装前缀长。
此文件的每一行都应为路径,在这种情况下,它被视为具有默认占位符 /opt/anaconda1anaconda2anaconda3
的文本文件,或者是空格分隔的占位符、模式和路径列表,其中
占位符是构建前缀或占位符前缀。
模式是
text
或binary
。路径是要更新的文件的相对路径。
示例:在 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/no_link#
可选文件。列出所有无法链接(无论是软链接还是硬链接)到环境中的文件,而是复制这些文件。
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。
仅当 Build section 中的 include_recipe
标志为 True
时,此目录才存在。
链接和取消链接脚本#
您可以选择在链接和取消链接步骤之前和之后执行脚本。有关更多信息,请参阅 添加 pre-link、post-link 和 pre-unlink 脚本。
存储库结构和索引#
Conda 存储库(或频道)是一个目录树,通常通过 HTTPS 提供服务,它具有平台子目录,每个子目录都包含 conda 包和存储库索引。索引文件 repodata.json
列出了平台子目录中的所有 conda 包。使用 conda index
从目录中的 conda 包创建此类索引。它是完整的 conda 包文件名到 添加 pre-link、post-link 和 pre-unlink 脚本中描述的 info/index.json
中的字典对象的简单映射。
在以下示例中,存储库在 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 进行比较。 |
|
==, 和 != |
精确相等和不相等。 |
|
~= |
兼容性发布 |
|
| |
OR |
|
* |
匹配版本字符串中的 0 个或多个字符。在正则表达式方面,它与 |
|
, |
AND |
|
提示
,
的优先级高于 |,因此 >=1,<2|>3 表示大于或等于 1 且小于 2 或大于 3,这匹配 1、1.3 和 3.0,但不匹配 2.2。
注意
对于包匹配规范,也支持预发布版本控制,例如 >1.0b4
将匹配 1.0b5
和 1.0rc1
,但不匹配 1.0b4
或 1.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
命令行匹配规范示例#
使用命令行时,请将包含空格字符或以下任何字符的任何包版本规范用双引号或单引号引起来:<、>、* 或 |。
示例 |
含义 |
---|---|
|
模糊约束 numpy=1.11 匹配 1.11、1.11.0、1.11.1、1.11.2、1.11.18 等。 |
|
精确约束 numpy==1.11 匹配 1.11、1.11.0、1.11.0.0 等。 |
|
OR 约束 "numpy=1.11.1|1.11.3" 匹配 1.11.1 或 1.11.3。 |
|
任何 numpy 版本 1.12.0a 或更高版本。 |
|
AND 约束 "numpy>=1.8,<2" 匹配 1.8 和 1.9,但不匹配 2.0。 |