如何使用 conda MatchSpec?

bgo*_*odr 7 conda

如何列出 conda 可用的软件包版本有一些有用的答案,其中之一在/sf/answers/3345709041/使用两个等号。 conda search -h没有完全说明 MatchSpec 语法允许的内容,只给出了一些简单的例子。

例如,我想查看最新版本的python 下存在哪些包,对于一个名为jedi. 我不得不求助于实验和猜测来找到正确的语法,因为上面缺少 MatchSpec 语法的详细文档。我结束了:

$ condaw search 'jedi[build=py37*]' --json | grep '"build"' 
      "build": "py37_1",
      "build": "py37_0",
      "build": "py37_0",
      "build": "py37_0",
      "build": "py37_0",
$ 
Run Code Online (Sandbox Code Playgroud)

使用上面的--json选项只是为了让我可以找出哪些关键字(例如)build可能是语法的一部分。

那么,MatchSpec 语法在哪里有正式和完整的文档,这样我就不必猜测了?我现在得出的结论是-h输出是唯一的。

mer*_*erv 10

conda-build docs 中一些(可能已经过时)文档。但是,我仍然认为他们代码中的文档更清晰。它可以从激活的读取基础env中使用

python -c "from conda.models.match_spec import MatchSpec; help(MatchSpec)"
Run Code Online (Sandbox Code Playgroud)

或在GitHub repo 上

从技术上讲,代码文档更多是关于将MatchSpec对象序列化为字符串表示,而不是解析字符串的另一个方向,但它涵盖了所有可能性。


匹配规范字符串

部分文档描述了类本身,但这里是类的字符串文字表示的相关部分:

规范字符串表示一般可以表示为

(channel(/subdir):(namespace):)name(version(build))[key1=value1,key2=value2]
Run Code Online (Sandbox Code Playgroud)

其中()指示可选字段。构建规范字符串表示的规则是:

  1. name(即"包名") 是必需的,但它的值可以是'*'。它的位置总是在键值括号之外。
  2. 如果version是精确版本,则它超出键值括号并以==. 如果version是一个“模糊”值(例如1.11.*),它会在键值括号之外, .*左边是关闭的,并以=. 否则version包含在键值括号内。
  3. Ifversion是一个精确的版本,并且build是一个精确的值,build则超出以 a​​ 开头的键值括号=。否则,build进入键值括号内。 build_string 是 的别名build
  4. namespace职位是为未来的 conda 功能而保留的。
  5. 如果channel包含并且是精确值,::则在channel 和之间使用分隔符namechannel可以是规范的频道名称或频道网址。在规范字符串表示中,将始终使用规范通道名称。
  6. 如果channel是一个精确值,并且subdir是一个精确值,subdir被附加到 channel/分离器。否则, subdir包含在键值括号中。
  7. 键值括号可以用逗号、空格或逗号+空格分隔。值可以选择用单引号或双引号括起来,但如果value包含逗号、空格或等号,则必须括起来。规范格式使用逗号分隔符和单引号。
  8. MatchSpec从字符串构造 :class:实例时,键值括号内给出的任何键值对都会覆盖括号外给出的任何匹配参数。

支持的键

除了字符串中明确表示的字段外,还支持以下键:

  • build_number
  • track_features
  • features
  • url
  • md5
  • license
  • license_family
  • fn

注: fn代表˚F ILE ñ火焰。

例子

文档继续给出示例,展示如何使用此类MatchSpec生成这些规范字符串:

(channel(/subdir):(namespace):)name(version(build))[key1=value1,key2=value2]
Run Code Online (Sandbox Code Playgroud)