本卡屬 FR-092(母卡 CM-1703),第 6 棒盤點。只盤不修、不動 pyproject。
主專案 pyproject 宣告了 60 多個第三方套件。第 2 棒(CM-1705)刪掉 PDF 工具鏈後,pdfplumber、pypdfium2 很可能沒人用了;其他套件也可能早就沒人 import 但一直裝著(每個都進 Nuitka 編譯與出貨 image,是體積與資安面)。你要列出「宣告了但主專案零 import」的套件,並查清是不是被 jedi 套件、build 腳本、或 Nuitka 的 --include-package 間接需要。
落地版出貨 image 每多一個套件就多一份授權盤點(2026-08 授權盤點 PyMuPDF 就是這樣抓到 AGPL)與 CVE 面。沒人用的套件是純成本。
pdfplumber、pypdfium2、pytesseract、Pillow:PDF 鏈刪掉後是否還有人用(Pillow 可能被 qrcode[pil] 需要)。google-generativeai、openai、anthropic 三家 AI SDK:確認各自的呼叫點是否都活著,還是只剩某一家在用。pandas:主專案自己 import 幾處?若只剩 jedi 套件用,該由套件自己宣告。eventlet 與 gevent 同時宣告:SocketIO 模式只用一個,查 main.py 與 core/app_factory.py 哪個是活的。scripts/build/build_release.sh 與 excluded_pkgs_probe.py 的排除/包含清單:Nuitka 打包時明列的套件若在主專案零 import,要標出來。本範圍從未系統性掃過。CM-1235(2026-08-18)拔 PyMuPDF 時只處理那一支。FR-069 D9 曾抓到 jedi 套件端 4 個虛掛依賴,主專案端沒對應盤過。
第一步:裝 deptry 到 scratchpad:
S=<你的 scratchpad>
poetry run python -m pip install -q --target "$S/tools" deptry
PYTHONPATH="$S/tools" poetry run python -m deptry . --ignore-notebooks -o "$S/deptry.json" --json-output "$S/deptry.json" 2>&1 | tail -40
第二步:deptry 的「宣告但未用」每條再做三查:① 主專案 grep -rn "^from <pkg>\|^import <pkg>" --include='*.py' .(注意 import 名與 pypi 名不同,如 PIL↔Pillow、google.generativeai↔google-generativeai、yaml↔pyyaml);② jedi 套件目錄同款 grep,並查該套件自己的 pyproject 有沒有宣告;③ scripts/build/ 兩檔 grep 套件名。
第三步:分四類——A 主專案與套件都零用、build 也沒列:可拔;B 主專案零用但某 jedi 套件在用且已自行宣告:主專案可拔;C 主專案零用、jedi 套件在用但沒宣告:套件 pyproject 缺漏,主專案暫不可拔;D build 腳本明列:要查為什麼列。