You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何pdm-build无法打包includes中指定的非Python文件?

解决PDM打包不包含非Python数据文件的问题

核心问题分析

PDM默认使用pdm-backend构建,它遵循PEP 621标准,依赖project.package-data配置指定包内需要包含的非Python文件,而非仅靠[tool.pdm.build].includes。你当前的配置缺少标准的包数据声明,导致非Python文件未被纳入分发包。

具体修复步骤

1. 添加PEP 621标准的package-data配置

在pyproject.toml的[project]区块下添加以下内容,明确指定要包含的文件:

[project.package-data]
"report" = [
    "assets/**/*.html",
    "conf/**/*.yaml"
]

该配置会告知构建后端:report包下,assets目录所有子目录的.html文件、conf目录所有子目录的.yaml文件都需要被包含到分发包中。

2. 简化[tool.pdm.build]配置

保留package-dir = ".",简化includes配置(核心包目录已足够,数据文件由package-data管控):

[tool.pdm.build]
package-dir = "."
includes = ["report"]

同时移除重复或错误的路径配置(比如你写的report/assets/report_remplate.html存在拼写错误,这类冗余配置直接删除即可)。

3. 修复脚本配置的语法错误

你当前配置中,l = { composite = ["lint", "format", "mypy"] }等脚本项被放在了[tool.pdm.build]区块外,需将所有脚本配置移入[tool.pdm.scripts]区块:

[tool.pdm.scripts]
report = "python -m report"
help = "python -m report.get_conf -h"
template = "python -m report.get_conf"
l = { composite = ["lint", "format", "mypy"] }
test = "pytest tests"
lint = "ruff check --fix"
format = "ruff format"
mypy = "mypy ."
post_install = { composite = [
    "pre-commit autoupdate",
    "pre-commit install",
    "pre-commit install --hook-type commit-msg",
] }

4. 本地验证构建结果

执行本地构建命令,检查生成的包是否包含目标文件:

pdm build

解压dist目录下的.tar.gz或.whl文件,确认report/assets和report/conf下的.html、.yaml文件是否存在。若本地构建正常,通过Git安装时这些文件也会被正确包含。

额外注意事项

  • 不要依赖MANIFEST.in:pdm-backend默认不读取该文件,除非显式设置[tool.pdm.build].use-manifest = true,但PEP 621的package-data是更标准的方式,优先使用。
  • 检查.gitignore:确保未排除.yaml或.html文件,避免从Git拉取源码时缺失文件(你提到setuptools打包正常,此步骤可按需跳过)。
  • 版本兼容性:确保PDM版本不低于2.0,旧版本对PEP 621的支持可能不完善。

内容的提问来源于stack exchange,提问作者Adam Bajger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:02:04