我們在「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課(pip install…)」有提到如何打包Python讓自己的程式變成套件, 讓其他人可以用pip install的方式進行安裝,😲 But… 我們實際上打包後, 發現到引用的檔案都有被打包進去,但目錄卻未被打包, 究竟是什麼原因呢? 讓我們來好好探討一下吧!
├── images
├── progressbar
│ ├── __init__.py
│ ├── __main__.py
│ ├── api
│ │ ├── index.html
│ │ └── router.py
│ ├── core.py
│ ├── sub
│ │ ├── __init__.py
│ │ └── main.py
│ └── version.py
├── pyproject.toml
└── requirements.txt
底下我們所引入的sub與router模組, 期望在打包建置時能夠一併納入。
# progressbar/core.py
from progressbar.sub.main import sub
from progressbar.api.router import router
[build-system]
requires = ["setuptools>=67", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "progressbar"
authors = [
{name = "作者", email = "[email protected]"},
]
description = "老闆要的進度條"
readme = "README.md"
requires-python = ">=3.8"
license = {text = "MIT"}
dynamic = ["version", "dependencies"]
[tool.setuptools.dynamic]
version = {attr = "progressbar.__version__"}
dependencies = {file = ["requirements.txt"]}
[project.scripts]
progressbar = "progressbar.__main__:progress"
# 建置及打包
python -m build
# 錯誤訊息
No `packages` or `py_modules` configuration, performing automatic discovery
加入這一段
[tool.setuptools.packages.find]
include = ['progressbar']
結果我們的api跟sub目錄就這樣遺失了…
[tool.setuptools.packages.find]
include = ['progressbar*']
再來建置一次之後
# 建置及打包
python -m build
大功告成… ✌️
雖然是一個小小的配置, 但背後的知識卻是極其龐大, 尤其是我們在使用第三方資源時最容易發生這樣的狀況, 畢竟程式不是我們自行撰寫的, 因此要在認知上與作者相同水平本就不易, 只能從蛛絲馬跡或是說明文件中找出端倪, 不過最後終於找到原因了, 也將經驗分享於此, 期望遇到相同狀況的朋友能夠找到解方。