使用Poetry发布Python包到私有源

作者: 潘峰 / 2022-07-30 / 分类: Work

Python

日常 Python 开发过程中,总是少不了需要连接测试数据库,发送接口请求,下载上传文件等等。
如果我们仅有一个项目需要执行这些操作,那把他们封装成公共方法放在本地的 utils 目录下固然可行,但实际上往往会有多个项目需要执行这些操作。
那么更好的方式是:把他们打成一个 Python 包,上传到公司的私有源中,需要使用的项目通过 pip install 安装即可。其优点不言而喻。

Python 打包发布方式

Python 传统的打包发布方式是通过手动配置 setup.pysetup.cfg 文件,然后使用 setuptools 进行打包,最后借助 twine 进行发布包到 pypi 。

作为热衷于偷懒的 Pythonista,必然要寻求更高效的打包发布方式。

于是新一代的包管理工具 Poetry 应运而生。

Poetry 简介

Poetry 拥有三大核心用途:

  • Develop(依赖管理、Python 虚拟环境)
  • Build(打包)
  • Publish(发布)

Poetry 打包并发布到公司 pypi 私有源

使用 Poetry 我们可以很方便地创建 Python 项目(poetry new),或是在原项目中引入 Poetrypoetry 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  # 强制使用私有源

主要需要注意:

  1. 添加一个 license,可参考 如何选择开源许可证LICENSE 文件可在 GitLab 上生成;

  2. 设置 packages,微业贷测试基础库的结构如下:

    we-x
    | - src
        | - we_x
    

    include 设置为最终需要进行打包的目录,即 we_xfrom 设置为 we_x 相对于根目录所在的目录,即 src

  3. 由于无法访问外网,在文件最底部的 [[tool.poetry.source]] 设置私有源信息。

修改完后执行 Poetry 打包命令

poetry build

成功后,根目录下会生成包括 dist 在内的几个文件夹,dist 目录下即是打好的包文件。后续将发布到公司 pypi 私有源。

发布

公司的私有源基于 devpi 部署,在发布包之前需要获取 devpi 的用户名和密码,目前私库主要使用 dev 用户进行发布。dev 用户及其索引已在私有源创建,获得密码后可以直接进行发布操作。

发布过程极为简单:

  1. 配置 Poetry 仓库信息:

    poetry config repositories.dev "http://pypi.weoa.com/dev/pypi"
    

    执行结束,可通过 poetry config --list 查看配置结果。

  2. 通过 dev 用户和密码执行发布操作:

    poetry publish -r dev -u dev -p dev的密码
    

    打开 http://pypi.weoa.com/dev/pypi 可以查看到发布成功的包。