为什么我不能使用 `exclude` 从我的 python 轮中排除 `tests` 目录?

Why can't I exclude `tests` directory from my python wheel using `exclude`?

考虑以下包结构:

具有以下setup.py内容:

from setuptools import setup, find_packages

setup(
    name='dfl_client',
    packages=find_packages(exclude=['*tests*']),
    include_package_data=True,
    package_data={"": ['py.typed', '*.pyi']},
)

当我使用 python setup.py sdist bdist_wheel 打包它时,生成的轮子:

我花了几个小时试图理解为什么没有成功。特别是因为它似乎适用于其他项目!

(我花了很多时间试图理解这个愚蠢的问题,所以我回答了我自己的问题,希望能为面临同样问题的其他人节省时间)

我终于找到了罪魁祸首:它是 setuptools_scminclude_package_data=True 标志之间的隐藏交互。

include_package_data=True 本身不会使 tests 目录包含在轮子中。但是,如果安装了 setuptools_scm 并且该文件夹受版本控制(并且 tests 目录在 git 管理的文件列表中),则 exclude 指令不会似乎不再考虑了。

所以解决方案只是删除 include_package_data=True,当存在 package_data 时实际上不需要:

from setuptools import setup, find_packages

setup(
    name='dfl_client',
    packages=find_packages(exclude=['*tests*']),
    package_data={"": ['py.typed', '*.pyi']},
)

参见 setuptools doc on including files (that is actually very straightforward about include_package_data) and this related issue and workaround(解决方法似乎也适用于 wheel,而不仅仅是 sdist)。