此文由 Mix Space 同步更新至 xLog
為獲得最佳瀏覽體驗,建議訪問原始鏈接
https://www.do1e.cn/posts/code/poetry
起因#
目前維護這兩個 Python 輪子:
之前一直使用的是setup.py
進行打包,不過 11 月份更新NJUlogin時發現這樣的一個提示:
********************************************************************************
With Python 2.7 end-of-life, support for building universal wheels
(i.e., wheels that support both Python 2 and Python 3)
is being obviated.
Please discontinue using this option, or if you still need it,
file an issue with pypa/setuptools describing your use case.
By 2025-Aug-30, you need to update your project and remove deprecated calls
or your builds will no longer be supported.
********************************************************************************
因此決定使用新的pyproject.toml
的方式進行打包。當時臨時學了Poetry並給NJUlogin做了適配,今天更新mijia-api想順便也做一個適配,結果發現忘了怎麼用,還是寫個博客記錄一下吧。看來之後也多多用Poetry來管理依賴了。
原本的打包腳本
```powershell remove-item dist -force -recurse python setup.py sdist build python setup.py bdist_wheel --universal twine upload dist/* ```Poetry#
Poetry官網上對自身的定位是:Python packaging and dependency management made easy。用起來有點像npm
(如果你對 nodejs 有一定了解的話),也是通過命令行修改管理依賴的文件。
不過 poetry 有點太長了,從現在開始你就叫pop
吧。
alias pop='poetry'
Set-Alias pop poetry
安裝#
直接查看文檔吧:https://python-poetry.org/docs/#installation
我這裡用的是 pipx 進行安裝
初始化已有項目#
pop init
得到下述pyproject.toml
文件
[tool.poetry]
name = "mijiaapi"
version = "0.0.0"
description = "A Python API for Xiaomi Mijia"
authors = ["Do1e <[email protected]>"]
license = "GPLv3"
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.12"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
不過因為我的包裡面包含大寫字母,需要把[tool.poetry]
下面的name
改了的同時,再額外手動加一個packages
項,另外再把setup.py
中的一些其他配置加上來:
2c2
< name = "mijiaapi"
---
> name = "mijiaAPI"
7a8,17
> homepage = "https://github.com/Do1e/mijia-api"
> repository = "https://github.com/Do1e/mijia-api"
> packages = [
> {include = "mijiaAPI"}
> ]
> classifiers = [
> "Programming Language :: Python :: 3",
> "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
> "Operating System :: OS Independent",
> ]
新建 Peotry 虛擬環境並安裝依賴#
默認會在~/.cache/pypoetry
裡創建虛擬環境,可以使用pop config
進行修改,詳見文檔這裡,我個人更習慣放在項目目錄中:
# 配置虛擬環境放在項目目錄中
pop config virtualenvs.in-project true
# 新建並使用虛擬環境
pop env use python
# 如果是在conda環境中使用就不需要了,會直接使用已有conda環境
source .venv/bin/activate
之後便可以從requirements.txt
中將依賴一個一個安裝上了,下面這個命令會將依賴寫入pyproject.toml
文件中並生成poetry.lock
:
pop add requests qrcode
Peotry 的一大優勢就是能夠以樹狀形式展示依賴:
pop show --tree
# qrcode 8.0 QR Code image generator
# └── colorama *
# requests 2.32.3 Python HTTP for Humans.
# ├── certifi >=2017.4.17
# ├── charset-normalizer >=2,<4
# ├── idna >=2.5,<4
# └── urllib3 >=1.21.1,<3
至此,可以將原來的setup.py
刪除了。
打包並發布#
版本可以使用poetry-dynamic-versioning動態指定,不用每次修改pyproject.toml
指定版本號。
git tag v1.3.0
pop self add "poetry-dynamic-versioning[plugin]"
pop dynamic-versioning enable
此時就可以簡單地使用一行命令構建了:
pop build
不像 twine 使用~/.pypirc
保存 pypi 的 token,Poetry 需要額外進行配置:
pop config pypi-token.pypi pypi-xxxxxx
然後就可以發布了!
pop publish