对于 Python 包而言,如果没有有组织的保存、上传和下载方式,那么它是没有用的。Python 包索引(一个搜索下载包的平台)是 Python 社区开源包的主要来源,任何人都可以免费上传新的包,唯一的要求就是在 PyPI 网站上进行注册。
当然,我们不必局限于这个索引,而且所有打包工具都支持使用其他包仓库。对于在内部组织分发或为了开发目的而分发的闭源代码来说,这一点特别有用。
本节,主要解决如何向 PyPI 上传程序包,同时还会简单介绍一下指定其他仓库的方法。
如前所述,PyPI 是开源包发行版的官方来源。从 PyPI 下载不需要任何账号或者权限,唯一需要的是一个包管理器,可以从 PyPI 下载新的发行版,而首选应该是 pip。
任何人都可以注册并向 PyPI 上传包,只要有注册账号就行。包与用户绑定,默认情况下只有注册了包名称的用户是它的管理员,并且可以上传新的发行版。但对于大型项目来说,有一个选项可以指定其他用户作为包的维护者,以便他们能够上传新的发行版。
上传包的最简单方法就是使用 setup.py 脚本的 upload 命令:
这里的 <dist-commands> 是创建要上传的发行版的命令列表,只有在相同的 setup.py 执行期间创建的发行版才会被上传到仓库中。
因此,如果想要同时上传源代码发行版、构建发行版和 wheel 包,可以使用下列命令:
注意,使用 setup uplod 的方式有以下 2 个问题:
这里推荐大家使用 twine 作为 setup.py upload 的安全替代。twine 是与 PyPI 交互的实用程序,目前只有一个作用,就是将包安全地上传到仓库中。twine 支持任何打包格式,并始终确保连接安全,它还允许上传已经创建的文件,这样能够在发布之前对发行版进行测试。
twine 的一个示例用法仍然需要调用 setup.py 来构建发行版,如下所示:
注意,在上传之前一定要注册账号,否则上传会失败。当然,也可以使用 twine 来完成注册,如下所示:
.pypirc 是一个配置文件,其中保存有关 Python 包仓库的信息,应位于包的主目录中。该文件的格式如下所示:
其中,distutils 字段应该包含 index-servers 变量,其中列出描述所有可用仓库及其证书的所有区段。每个仓库区段中只能修改下面这 3 个变量:
注意,明文保存仓库密码可能并不安全,我们可以一直将其空这,必要时再提示输入。
所有为 Python 构建的打包工具都应该遵守 .pypirc 文件。虽然不是每个打包相关的实用程序都满足这一要求,但大多数重要的实用程序都支持这一点,例如 pip、twine、distutils 和 setuptools。