Desc
通过 Github Action 将自己的 Python 包自动化发布到 PyPI。实际上 Python 官方在这方面的文档非常齐全,跟着官方教程点点鼠标、复制粘贴就可以完成。比那个什么 NPM 不知道高到哪里去了。
本文简单介绍基于 pyproject.toml
的通过 Github Action 进行打包和发布的大概步骤以及一些注意事项,至于一些细节、个性化的东西请看官方文档。
Reference
setuptools
的简单介绍 - https://setuptools.pypa.io/en/latest/userguide/quickstart.html- 使用
pyproject.toml
配置setuptools
- https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html - 打包 Python 项目 - https://packaging.python.org/en/latest/tutorials/packaging-projects/
- 编写自己的
pyproject.toml
- https://packaging.python.org/en/latest/guides/writing-pyproject-toml/ - 通过 Github Action 工作流发布 Python 包 - https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/
前置准备
- 拥有 Github 账户;
- 注册 PyPI 账户并开启 2FA(双因素认证);
安装和升级 setuptools
、build
只是用于后面调试本地打包和调试 pyproject.toml
。实际上使用 Github Action 打包,不需要在本地安装打包工具。
pip 最好也更新一下。
目录结构
根据官方文档
https://packaging.python.org/en/latest/tutorials/packaging-projects/#creating-the-package-files ,使用 pyproject.toml
时,建议将代码放置在 src 目录下。
代码文件较多时,可以分包分成多个文件夹。如果只是小项目代码少,直接放在 src
目录下也是可以的。
<project_name>/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│ └── <package_name>/
│ │ ├── __init__.py
│ │ └── <module_name>.py
│ └── <module2_name>.py
│ └── <module3_name>.py
└── tests/
编写 pyproject.toml
打包只需要 name
, version
字段。
其他的字段可根据文档自行添加:
- https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html
- https://packaging.python.org/en/latest/tutorials/packaging-projects/#configuring-metadata
本地调试打包
在项目目录下执行
|
|
即可进行打包。输出的 tar
文件和 wheel
文件会在 dist
中。通过此步骤检查打包是否可以正常运行,及时调整,节省后面调整 CI 的时间。
打包完成后要记得检查 tar 文件里,各种文件是否齐全。设置不当可能一些文件没有打包进来。
配置 Github Action 工作流
创建工作流
本地打包没有问题就可以创建 Github Action 工作流。官方文档 https://packaging.python.org/en/latest/guides/ 里写得挺详细,步骤也很简单,也没有什么 Bug。直接用就可以了。
例如在 .github/workflows/
目录下创建 publish.yml
(记住这个名字,后面要用)。
|
|
官方文档中 https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/ ,还有发布到 TestPyPI 和发布 Github Release 的工作流。原理相似的,这里不赘述。
设置 PyPI 的可信发布者
建立工作流后不要着急推送到仓库。先要到 PyPI 中设置可信发布者。
设置 PyPI 的项目名、Github 仓库的拥有者、Github 仓库名、工作流的文件名。 Gitub Action 的环境名可以不设置,但强烈建议设置(strongly encouraged)。
https://pypi.org/manage/account/publishing/
推送到 Github
完成上面的步骤就可以将工作流推送到 Github 上。
根据触发条件触发工作流,测试是否可以正常运行。
End
整个流程下来感觉没什么坑,连 token 都不需要设置。Python 官方的文档教程都很全面和清晰。跟 NPM 比起来,要简便很多。