更新於 2024/04/26閱讀時間約 4 分鐘

【💊 Python的解憂錦囊】python -m build 打包時也能包含被引用的目錄



raw-image

情況描述

我們在「【🔒 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 = "youremail@gmail.com"},
]
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

我們只好想辦法include…

加入這一段

[tool.setuptools.packages.find]
include = ['progressbar']

結果我們的api跟sub目錄就這樣遺失了…


原來我們沒有使用wildcard

[tool.setuptools.packages.find]
include = ['progressbar*']

再來建置一次之後

# 建置及打包
python -m build

大功告成… ✌️

結語

雖然是一個小小的配置, 但背後的知識卻是極其龐大, 尤其是我們在使用第三方資源時最容易發生這樣的狀況, 畢竟程式不是我們自行撰寫的, 因此要在認知上與作者相同水平本就不易, 只能從蛛絲馬跡或是說明文件中找出端倪, 不過最後終於找到原因了, 也將經驗分享於此, 期望遇到相同狀況的朋友能夠找到解方。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.