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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:40:34