日常 Python 开发过程中,总是少不了需要连接测试数据库,发送接口请求,下载上传文件等等。
如果我们仅有一个项目需要执行这些操作,那把他们封装成公共方法放在本地的 utils 目录下固然可行,但实际上往往会有多个项目需要执行这些操作。
那么更好的方式是:把他们打成一个 Python 包,上传到公司的私有源中,需要使用的项目通过 pip install 安装即可。其优点不言而喻。
Python 打包发布方式
Python 传统的打包发布方式是通过手动配置 setup.py、setup.cfg 文件,然后使用 setuptools 进行打包,最后借助 twine 进行发布包到 pypi 。
作为热衷于偷懒的 Pythonista,必然要寻求更高效的打包发布方式。
于是新一代的包管理工具 Poetry 应运而生。
Poetry 简介
Poetry 拥有三大核心用途:
- Develop(依赖管理、Python 虚拟环境)
- Build(打包)
- Publish(发布)
Poetry 打包并发布到公司 pypi 私有源
使用 Poetry 我们可以很方便地创建 Python 项目(poetry new),或是在原项目中引入 Poetry(poetry init),这里不再赘述。
打包
当你的项目使用了 Poetry 后,在根目录下会有一个名为 pyproject.toml 的文件,里面以 TOML 格式记录了当前项目打包后的基础信息。打包前,我们需要对其稍作修改。
以自研测试库为例(poetry 1.4):
[tool.poetry]
name = "spindlet"
version = "1.0.0"
description = ""
authors = [""]
license = "MIT"
readme = "README.md"
homepage = ""
repository = ""
classifiers = [
"Programming Language :: Python :: 3.12",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
packages = [
{ include = "spindlet", from="src" }
]
[tool.poetry.dependencies]
...
[tool.poetry.dev-dependencies]
...
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
[[tool.poetry.source]]
name = "xxx"
url = "http://pypi.xxx.com/dev/pypi/+simple/"
default = true # 强制使用私有源
主要需要注意:
-
添加一个 license,可参考 如何选择开源许可证。
LICENSE文件可在 GitLab 上生成; -
设置
packages,微业贷测试基础库的结构如下:we-x | - src | - we_xinclude设置为最终需要进行打包的目录,即we_x;from设置为we_x相对于根目录所在的目录,即src。 -
由于无法访问外网,在文件最底部的
[[tool.poetry.source]]设置私有源信息。
修改完后执行 Poetry 打包命令
poetry build
成功后,根目录下会生成包括 dist 在内的几个文件夹,dist 目录下即是打好的包文件。后续将发布到公司 pypi 私有源。
发布
公司的私有源基于 devpi 部署,在发布包之前需要获取 devpi 的用户名和密码,目前私库主要使用 dev 用户进行发布。dev 用户及其索引已在私有源创建,获得密码后可以直接进行发布操作。
发布过程极为简单:
-
配置
Poetry仓库信息:poetry config repositories.dev "http://pypi.weoa.com/dev/pypi"执行结束,可通过
poetry config --list查看配置结果。 -
通过
dev用户和密码执行发布操作:poetry publish -r dev -u dev -p dev的密码打开 http://pypi.weoa.com/dev/pypi 可以查看到发布成功的包。