setuptools.build_meta自动发现致tar.gz纳入非必要目录,排除配置无效
解决src-layout Python包tar.gz构建包含冗余目录的问题
核心原因
setuptools的自动发现功能在处理sdist(tar.gz)时,默认会包含版本控制目录(如.git)下追踪的所有文件,即便你在配置里排除,也可能被版本控制的文件列表覆盖。另外,无setup.py且仅依赖自动发现时,setuptools对sdist的文件筛选逻辑和wheel不同。
有效解决步骤
明确配置
pyproject.toml的sdist文件规则
在pyproject.toml中添加tool.setuptools配置,显式指定sdist要包含的文件:[tool.setuptools] package-dir = {"" = "src"} packages = ["postopus"] # 替换成你的包名 [tool.setuptools.package-data] # 如果需要包含src下的非py文件,在这里配置,比如: # postopus = ["*.txt", "templates/*"] [tool.setuptools.sdist] exclude = ["tests/", "docs/", ".github/", "*.pyc", "__pycache__/"] include = ["src/**/*", "pyproject.toml", "setup.cfg", "README.md", "LICENSE"] # 只保留必要文件补充
MANIFEST.in的严格规则
创建或修改MANIFEST.in,强制排除冗余目录,优先级高于版本控制追踪:include README.md LICENSE pyproject.toml setup.cfg recursive-include src * prune tests prune docs prune .github global-exclude *.pyc __pycache__ *.swp *.swo清理构建缓存后重新构建
每次修改配置后,先清理旧的构建产物和缓存:rm -rf dist/ build/ *.egg-info/ python3 -m build --sdist --wheel验证sdist内容
构建完成后,解压tar.gz文件检查内容:tar -tzf dist/postopus-*.tar.gz | grep -E "(tests|docs)" # 应该无输出
额外注意事项
- 确保你的版本控制(如git)的
.gitignore已经排除了dist/、build/等目录,但不要依赖.gitignore来控制sdist内容,必须显式配置。 - setuptools 67.x版本的自动发现对sdist的处理确实存在一些细节差异,若上述配置无效,可以尝试升级到setuptools 68+版本,官方修复了部分自动发现的文件筛选问题。
内容的提问来源于stack exchange,提问作者KevinYanesG
相关产品推荐
相关产品推荐

