PEP 345 – Python 软件包元数据 1.2
- 作者:
- Richard Jones <richard at python.org>
- 讨论至:
- Distutils-SIG 邮件列表
- 状态:
- 已取代
- 类型:
- 标准跟踪
- 主题:
- 打包
- 创建日期:
- 2005年4月28日
- Python 版本:
- 2.7
- 发布历史:
- 2009年12月22日
- 取代:
- 314
- 取代者:
- 566
- 决议:
- Python-Dev 帖子
目录
- 摘要
- 字段
- 元数据版本(Metadata-Version)
- 名称
- 版本
- 平台(Platform)(多重使用)
- Supported-Platform(多次使用)
- 总结
- 描述(Description)(可选)
- 关键词(Keywords)(可选)
- 主页(Home-page)(可选)
- Download-URL
- 作者(Author)(可选)
- Author-email(可选)
- Maintainer(可选)
- Maintainer-email(可选)
- License(可选)
- Classifier(多次使用)
- Requires-Dist(多次使用)
- Provides-Dist(多次使用)
- Obsoletes-Dist(多次使用)
- Requires-Python
- Requires-External(多次使用)
- Project-URL(多次使用)
- 版本说明符
- 环境标记
- 与PEP 314的差异总结
- 参考资料
- 版权
- 致谢
摘要
本PEP描述了一种向Python发行版添加元数据的机制。它包括字段名称的细节,以及它们的语义和用法。
本文档指定元数据格式的1.2版本。1.0版本在PEP 241中指定。1.1版本在PEP 314中指定。
元数据格式的1.2版本增加了一些可选字段,旨在使Python软件的第三方打包更容易。这些字段是“Requires-Python”、“Requires-External”、“Requires-Dist”、“Provides-Dist”和“Obsoletes-Dist”。此版本还更改了“Platform”字段。还添加了三个新字段:“Maintainer”、“Maintainer-email”和“Project-URL”。
最后,这个新版本还添加了环境 标记。
字段
本节规定了每个支持的元数据字段的名称和语义。
标有“(多次使用)”的字段可以在单个 PKG-INFO 文件中多次指定。其他字段在 PKG-INFO 文件中只能出现一次。标有“(可选)”的字段在有效的 PKG-INFO 文件中不是必需的;所有其他字段都必须存在。
元数据版本(Metadata-Version)
文件格式版本;“1.2”是唯一合法的值。
示例
Metadata-Version: 1.2
名称
发行版的名称。
示例
Name: BeagleVote
版本
包含发行版版本号的字符串。此字段必须采用PEP 440中指定的格式。
示例
Version: 1.0a2
平台(Platform)(多重使用)
一个平台规范,描述了发行版支持的操作系统,该操作系统未在“操作系统”Trove分类器中列出。请参阅下面的“分类器”。
示例
Platform: ObscureUnix
Platform: RareDOS
Supported-Platform(多次使用)
包含PKG-INFO文件的二进制发行版将在其元数据中使用Supported-Platform字段来指定编译二进制发行版的操作系统和CPU。Supported-Platform字段的语义未在本PEP中指定。
示例
Supported-Platform: RedHat 7.2
Supported-Platform: i386-win32-2791
总结
发行版功能的单行摘要。
示例
Summary: A module for collecting votes from beagles.
描述(Description)(可选)
发行版的较长描述,可以跨越多个段落。处理元数据的软件不应假设此字段有任何最大大小,尽管人们不应将他们的说明手册作为描述。
此字段的内容可以使用reStructuredText标记[1]编写。对于处理元数据的程序,支持标记是可选的;程序也可以按原样显示字段的内容。这意味着作者在使用标记时应保守。
为了支持空行和相对于RFC 822格式的缩进行,任何CRLF字符都必须加上7个空格和一个竖线(“|”)字符作为后缀。结果,Description字段被编码成一个折叠字段,可以由RFC 822#section-3.1.1解析器解释。
示例
Description: This project provides powerful math functions
|For example, you can use ``sum()`` to sum numbers:
|
|Example::
|
| >>> sum(1, 2)
| 3
|
此编码意味着,当使用RFC 822阅读器展开字段时,任何后跟7个空格和竖线字符的CRLF都必须替换为单个CRLF。
关键词(Keywords)(可选)
用于协助在更大目录中搜索发行版的附加关键字列表。
示例
Keywords: dog puppy voting election
主页(Home-page)(可选)
包含发行版主页URL的字符串。
示例
Home-page: http://www.example.com/~cschultz/bvote/
Download-URL
包含可以下载此版本发行版的URL的字符串。(这意味着URL不能是“…/BeagleVote-latest.tgz”之类的,而必须是“…/BeagleVote-0.45.tgz”。)
Maintainer(可选)
包含维护者姓名的字符串,至少;可以提供额外的联系信息。
请注意,此字段旨在用于项目由原作者以外的人维护的情况:如果与Author相同,则应省略此字段。
示例
Maintainer: C. Schultz, Universal Features Syndicate,
Los Angeles, CA <cschultz@peanuts.example.com>
Maintainer-email(可选)
包含维护者电子邮件地址的字符串。它可以包含名称和电子邮件地址,采用RFC 822 From: 标头所允许的合法形式。
请注意,此字段旨在用于项目由原作者以外的人维护的情况:如果与Author-email相同,则应省略此字段。
示例
Maintainer-email: "C. Schultz" <cschultz@example.com>
License(可选)
指示发行版所涵盖的许可证的文本,其中许可证不是“License”Trove分类器中的选择。请参阅下面的“分类器”。此字段还可用于指定通过Classifier字段命名的特定版本的许可证,或指示此类许可证的变体或例外。
示例
License: This software may only be obtained by sending the
author a postcard, and then the user promises not
to redistribute it.
License: GPL version 3, excluding DRM provisions
Classifier(多次使用)
每个条目是一个字符串,给出发行版的单个分类值。分类器在PEP 301中描述。
示例
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console (Text Based)
Requires-Dist(多次使用)
每个条目都包含一个字符串,命名此发行版所需的其他distutils项目。
需求字符串的格式与distutils项目名称的格式相同(例如,在Name:字段中找到的名称)。可选地,后面可以跟括号内的版本声明。
distutils项目名称应与Python Package Index上的名称对应。
版本声明必须遵循版本说明符中描述的规则
示例
Requires-Dist: pkginfo
Requires-Dist: PasteDeploy
Requires-Dist: zope.interface (>3.5.0)
Provides-Dist(多次使用)
每个条目都包含一个字符串,命名此发行版中包含的Distutils项目。此字段必须包含Name字段中标识的项目,后跟版本:名称(版本)。
发行版可以提供附加名称,例如,指示多个项目已捆绑在一起。例如,ZODB项目的源代码发行版历史上包含transaction项目,该项目现在作为单独的发行版提供。安装此类源代码发行版可满足对ZODB和transaction的要求。
发行版还可以提供一个“虚拟”项目名称,该名称不对应任何单独分发的项目:这样的名称可能用于指示一种抽象能力,该能力可以由多个项目中的一个提供。例如,多个项目可能为给定的ORM提供RDBMS绑定:每个项目可能声明它提供ORM-bindings,允许其他项目仅依赖于最多安装其中一个。
可以提供版本声明,并且必须遵循版本说明符中描述的规则。如果未指定版本号,则将隐含发行版的版本号。
示例
Provides-Dist: OtherProject
Provides-Dist: AnotherProject (3.4)
Provides-Dist: virtual_package
Obsoletes-Dist(多次使用)
每个条目都包含一个字符串,描述此发行版所废弃的distutils项目发行版,这意味着这两个项目不应同时安装。
可以提供版本声明。版本号必须采用版本说明符中指定的格式。
此字段最常见的用途是项目名称更改的情况,例如,Gorgon 2.3被并入Torqued Python 1.0。安装Torqued Python时,应删除Gorgon发行版。
示例
Obsoletes-Dist: Gorgon
Obsoletes-Dist: OtherProject (<3.0)
Requires-Python
此字段指定发行版保证兼容的Python版本。
版本号必须采用版本说明符中指定的格式。
示例
Requires-Python: 2.5
Requires-Python: >2.1
Requires-Python: >=2.3.4
Requires-Python: >=2.5,<2.7
Requires-External(多次使用)
每个条目都包含一个字符串,描述系统中的某些依赖项,发行版将使用这些依赖项。此字段旨在作为对下游项目维护者的提示,并且对于distutils发行版没有有意义的语义。
需求字符串的格式是外部依赖项的名称,可选地后跟括号内的版本声明。
因为它们指的是非Python软件版本,所以此字段的版本号**不**需要符合PEP 440中指定的格式:它们应与外部依赖项使用的版本方案对应。
请注意,对要使用的字符串没有特定规则。
示例
Requires-External: C
Requires-External: libpng (>=1.5)
Project-URL(多次使用)
一个字符串,包含项目的额外URL及其标签,用逗号分隔。当元数据中除了“Home-page”字段外还有其他URL需要列出时,应使用此字段。
示例
Project-URL: Bug Tracker, https://github.com/pypa/setuptools/issues
Project-URL: Documentation, https://setuptools.readthedocs.io/
Project-URL: Funding, https://donate.pypi.org
标签是自由文本,最大长度为32个字符。请注意,上传到PyPI的发行版将在其着陆页的“项目链接”部分显示这些额外条目。
版本说明符
版本说明符是一系列条件运算符和版本号,用逗号分隔。条件运算符必须是“<”、“>”、“<=”、“>=”、“==”和“!=”之一。
可以指定任意数量的条件运算符,例如,字符串“>1.0, !=1.3.4, <2.0”是合法的版本声明。逗号(“,”)等同于and运算符。
每个版本号必须采用PEP 440中指定的格式。
当提供版本时,它总是包含所有以相同值开头的版本。例如,Python的“2.5”版本将包括“2.5.2”或“2.5.3”等版本。在这种情况下,预发布和发布后版本被排除。因此,在我们的示例中,当使用“2.5”时,不包括“2.5a1”等版本。如果需要范围的第一个版本,则必须明确给出。在我们的示例中,它将是“2.5.0”。
请注意,某些项目可能会省略“2.5.x”系列第一个版本的“.0”后缀。
- 2.5
- 2.5.1
- 2.5.2
- 等等。
在这种情况下,必须明确使用“2.5.0”以避免“2.5”表示完整范围的符号之间的任何混淆。建议对一个系列使用相同长度的方案以完全避免此问题。
一些例子
Requires-Dist: zope.interface (3.1):任何以3.1开头的版本,不包括发布后或预发布版本。Requires-Dist: zope.interface (3.1.0):任何以3.1.0开头的版本,不包括发布后或预发布版本。由于该特定项目不使用超过3位数字,因此这也意味着“仅3.1.0发布”。Requires-Python: 3:任何Python 3版本,无论哪个,不包括发布后或预发布版本。Requires-Python: >=2.6,<3:任何Python 2.6或2.7版本,包括2.6的发布后版本,2.7的预发布和发布后版本。它不包括Python 3的预发布版本。Requires-Python: 2.6.2:等同于“>=2.6.2,<2.6.3”。因此这只包括Python 2.6.2。当然,如果Python用4位数字编号,它将包括2.6.2系列的所有版本。Requires-Python: 2.5.0:等同于“>=2.5.0,<2.5.1”。Requires-Dist: zope.interface (3.1,!=3.1.3):任何以3.1开头的版本,不包括3.1的发布后或预发布版本,并且不包括任何以“3.1.3”开头的版本。对于此特定项目,这意味着:“3.1系列的任何版本但不是3.1.3”。这等同于:“>=3.1,!=3.1.3,<3.2”。
环境标记
环境标记是一种可以在字段末尾、分号(“;”)之后添加的标记,用于添加关于执行环境的条件。
以下是一些使用此类标记的字段示例
Requires-Dist: pywin32 (>1.0); sys.platform == 'win32'
Obsoletes-Dist: pywin31; sys.platform == 'win32'
Requires-Dist: foo (1,!=1.3); platform.machine == 'i386'
Requires-Dist: bar; python_version == '2.4' or python_version == '2.5'
Requires-External: libxslt; 'linux' in sys.platform
这背后的微语言尽可能简单:它只比较字符串,使用==和in运算符(以及它们的相反),并且能够组合表达式。这也使非Python程序员易于理解。
伪语法是
EXPR [in|==|!=|not in] EXPR [or|and] ...
其中EXPR属于以下任何一种
- python_version = ‘%s.%s’ % (sys.version_info[0], sys.version_info[1])
- python_full_version = sys.version.split()[0]
- os.name = os.name
- sys.platform = sys.platform
- platform.version = platform.version()
- platform.machine = platform.machine()
- platform.python_implementation = platform.python_implementation()
- 一个自由字符串,如
'2.4',或'win32'
请注意,in仅限于字符串,这意味着不可能在右侧使用元组或列表等其他序列。
受益于此标记的字段是
- Requires-External
- Requires-Dist
- Provides-Dist
- Obsoletes-Dist
- Classifier
与PEP 314的差异总结
- Metadata-Version现在是1.2。
- 添加了环境标记。
- 更改的字段
- Platform(语法更改)
- Author-email(更改为可选字段)
- 新增字段
- Maintainer
- Maintainer-email
- Requires-Python
- Requires-External
- Requires-Dist
- Provides-Dist
- Obsoletes-Dist
- Project-URL
- 已弃用字段
- Requires(改为Requires-Dist)
- Provides(改为Provides-Dist)
- Obsoletes(改为Obsoletes-Dist)
参考资料
版权
本文档已置于公共领域。
致谢
Fred Drake、Anthony Baxter和Matthias Klose都为本PEP中提出的想法做出了贡献。
Tres Seaver、Jim Fulton、Marc-André Lemburg、Martin von Löwis、Tarek Ziadé、David Lyon以及Distutils-SIG的其他成员都为新更新版本做出了贡献。
来源:https://github.com/python/peps/blob/main/peps/pep-0345.rst