工程经验 - 基于 poetry 打包一个 cli 应用
核心步骤
pyproject.toml 的 [tool.poetry.scripts] 定义出命令名称 & 函数入口的 k v 映射
poetry 打包出 wheel 包
pip install 安装 wheel 包并使用命令
安装 pipx & poetry
# pipx
sudo apt update
sudo apt install pipx
pipx ensurepath
sudo pipx ensurepath --global
# poetry
pipx install poetry
创建 poetry 工程
创建工程空目录,并 cd 目录执行
poetry init
注意这个过程中的 python 版本,工程的依赖可以后续添加
创建 python 包,以及程序的入口 py 文件 & 函数,总体的工程目录如下
(pythonProject) waylandzhan@Liangs-MBP pyhello % tree
.
├── README.md
├── dist
│ ├── pyhello-0.0.1-py3-none-any.whl
│ └── pyhello-0.0.1.tar.gz
├── poetry.lock
├── pyhello
│ ├── __init__.py
│ └── cli.py
└── pyproject.toml
cli.py
import click
@click.command()
@click.argument('name')
def hello(name):
"""Simple program that greets NAME."""
click.echo(f'Hello, {name}!')
if __name__ == '__main__':
hello()
pyproject.toml
[tool.poetry]
name = "pyhello"
version = "0.0.1"
description = "wayland first cli wheel using pyhello!"
authors = ["waylandzhan"]
readme = "README.md"
# 定义工程依赖,不填写后续安装后运行报错
[tool.poetry.dependencies]
python = ">=3.7, <3.12"
click = "^8.1.3"
# 定义命令以及函数
[tool.poetry.scripts]
pyhello = "pyhello.cli:hello"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
打包 & 测试
在项目根目录运行poetry build
于是会出现 dist
包,里面会有打包好的 wheel
包
新建一个虚拟环境,并 pip install 此 wheel 包(例如 pyhello-0.0.1-py3-none-any.whl
),既可使用命令 pyhello
用例如下:
pyhello tom
Hello, tom!
至此 whl 包完成打包