On this page
4. 创建源分发
Note
该文档将一直保留,直到https://setuptools.readthedocs.io/en/latest/setuptools.html的setuptools
文档独立涵盖了此处当前包括的所有相关信息。
如一个简单的例子部分所示,您使用 sdist 命令创建源分发。在最简单的情况下,
python setup.py sdist
(假设您未在设置脚本或配置文件中指定任何 sdist 选项), sdist 为当前平台创建默认格式的存档。默认格式是在 Unix 上为 gzip 压缩的 tar 文件(.tar.gz
),在 Windows 上则为 ZIP 文件。
您可以使用--formats
选项指定任意多种格式,例如:
python setup.py sdist --formats=gztar,zip
创建一个压缩的 tarball 和一个 zip 文件。可用格式为:
Format | Description | Notes |
---|---|---|
zip |
zipfile(.zip ) |
(1),(3) |
gztar |
gzip 压缩的 tar 文件(.tar.gz ) |
(2) |
bztar |
bzip2 编辑的 tar 文件(.tar.bz2 ) |
|
xztar |
xz 的 tar 文件(.tar.xz ) |
|
ztar |
压缩的 tar 文件(.tar.Z ) |
(4) |
tar |
tar 文件(.tar ) |
在版本 3.5 中进行了更改:添加了对xztar
格式的支持。
Notes:
Windows 默认
在 Unix 上默认
需要外部 zip Util 或zipfile模块(自 Python 1.6 以来为标准 Python 库的一部分)
需要 compress 程序。请注意,此格式现在正待弃用,并将在以后的 Python 版本中删除。
当使用任何tar
格式(gztar
,bztar
,xztar
,ztar
或tar
)时,在 Unix 下,您可以指定将为归档的每个成员设置的owner
和group
名称。
例如,如果您希望归档文件的所有文件归 root 用户拥有:
python setup.py sdist --owner=root --group=root
4.1. 指定要分发的文件
如果您没有提供明确的文件列表(或有关如何生成文件的说明),则 sdist 命令会将最小的默认设置放入源代码分发:
py_modules
和packages
选项隐含的所有 Python 源文件ext_modules
或libraries
选项中提到的所有 C 源文件scripts
选项标识的脚本,请参见Installing Scripts。任何看起来像测试脚本的东西:
test/test*.py
(当前,Distutils 除了在源代码发行版中包含测试脚本外,不对测试脚本做任何事情,但是将来会有测试 Python 模块发行版的标准)任何标准 README 文件(
README
,README.txt
或README.rst
),setup.py
(或任何您称为安装脚本的文件)和setup.cfg
。与
package_data
元数据匹配的所有文件。参见安装包数据。与
data_files
元数据匹配的所有文件。参见安装其他文件。
有时这足够了,但是通常您会希望指定其他文件来分发。典型的方法是编写一个Lists 模板,默认情况下称为MANIFEST.in
。Lists 模板只是有关如何生成 Lists 文件MANIFEST
的指令列表,这是要包含在源分发中的文件的确切列表。 sdist 命令处理该模板,并根据其指令和在文件系统中找到的内容生成 Lists。
如果您喜欢滚动自己的 Lists 文件,则格式很简单:每行一个文件名,仅常规文件(或指向它们的符号链接)。如果您提供自己的MANIFEST
,则必须指定所有内容:上述默认文件集在这种情况下不适用。
在版本 3.1 中进行了更改:将生成的现有MANIFEST
与MANIFEST.in
或setup.py
之一进行比较不会进行 sdist 的重新生成。
在版本 3.1.3 中进行了更改:MANIFEST
文件以 Comments 开头,指示已生成文件。没有此 Comments 的文件不会被覆盖或删除。
在版本 3.2.2 中进行了更改:如果不存在MANIFEST.in
,则 sdist 将读取MANIFEST
文件,就像以前一样。
在版本 3.7 中更改:README.rst
现在已包含在 distutils 标准自述文件列表中。
Lists 模板每行有一个命令,其中每个命令指定一组文件,这些文件包括在源分发中或从源分发中排除。例如,我们再次转到 Distutils 自己的 Lists 模板:
include *.txt
recursive-include examples *.txt *.py
prune examples/sample?/build
含义应该非常清楚:包括分发根中与*.txt
匹配的所有文件,在examples
目录下与*.txt
或*.py
匹配的所有文件,并排除与examples/sample?/build
匹配的所有目录。所有这些操作都是在标准包含集之后完成的,因此您可以使用 Lists 模板中的明确说明从标准集中排除文件。 (或者,您可以使用--no-defaults
选项完全禁用该标准集.)Lists 模板迷你语言中还有其他几个命令可用;其他命令不可用。参见第创建源分发:sdist 命令节。
Lists 模板中命令的 Sequences 很重要:首先,我们具有如上所述的默认文件列表,并且模板中的每个命令都将添加到该文件列表或从中删除。完全处理 Lists 模板后,我们将删除不应包含在源代码分发中的文件:
Distutils“构建”树中的所有文件(默认为
build/
)名为
RCS
,CVS
,.svn
,.hg
,.git
,.bzr
或_darcs
的目录中的所有文件
现在,我们有了完整的文件列表,将其写入 Lists 以供将来参考,然后用于构建源分发存档。
您可以使用--no-defaults
选项禁用默认的包含文件集,也可以使用--no-prune
禁用标准排除集。
按照 Distutils 自己的 Lists 模板,让我们跟踪 sdist 命令如何构建要包括在 Distutils 源代码分发中的文件列表:
在
distutils
和distutils/command
子目录中包含所有 Python 源文件(因为在安装脚本的packages
选项中提到了与这两个目录相对应的软件包,请参见编写安装脚本)包括
README.txt
,setup.py
和setup.cfg
(标准文件)包含
test/test*.py
(标准文件)在发布根目录中包含
*.txt
(这将再次找到README.txt
,但稍后会删除此类冗余)在
examples
下的子树中包含与*.txt
或*.py
匹配的任何内容,排除子树中所有与
examples/sample?/build
匹配的目录开始的文件-这可能会排除前两个步骤包括的文件,因此,Lists 模板中的prune
命令在recursive-include
命令之后是很重要的排除整个
build
树以及任何RCS
,CVS
,.svn
,.hg
,.git
,.bzr
和_darcs
目录
就像在安装脚本中一样,Lists 模板中的文件和目录名称应始终用斜杠分隔; Distutils 将负责将它们转换为您平台上的标准表示形式。这样,Lists 模板可跨 os 移植。
4.2. 与 Lists 相关的选项
sdist 命令的正常操作过程如下:
如果 Lists 文件(默认为
MANIFEST
)存在并且第一行没有 Comments,表明它是从MANIFEST.in
生成的,则按原样使用它,不更改如果 Lists 文件不存在或先前已自动生成,请阅读
MANIFEST.in
并创建 Lists如果
MANIFEST
和MANIFEST.in
都不存在,则仅使用默认文件集创建 Lists现在使用
MANIFEST
中的文件列表(刚生成或读入)来创建源分发存档
有几个选项可以修改此行为。首先,使用--no-defaults
和--no-prune
禁用标准的“包含”和“排除”集。
其次,您可能只想(重新)生成 Lists,但不创建源分发:
python setup.py sdist --manifest-only