在bdist_wheel中包含文件,但不包含sdist

时间:2019-04-16 17:58:37

标签: python setuptools

许多人抱怨setuptools在制作package_data时没有包括sdist中提到的内容。 (请参阅hereherehere。)但是,似乎在某些时候已经更改,因此package_data中提到的项目不仅包含在{{ 1}} s,但也有bdist_wheel s。我的问题是我想要旧的行为。我希望将文件(即编译的可执行文件)包含在sdist中,而不包含在bdist_wheel中。我现在该怎么办?

1 个答案:

答案 0 :(得分:2)

免责声明

尽管从技术上讲是可能的,但是请注意,当源dist不包含文件和wheel时,您最终将为相同的元数据安装不同的同一软件包,这是一个不良行为。在下面的示例中,

$ pip install spam --only-binary=spam  # force installation from wheel

将安装file.txt

$ pip show -f spam | grep file.txt
  spam/file.txt

同时

$ pip install spam --no-binary=spam  # force installation from source dist

不会。这是引入新错误的确定来源,没有用户会感谢您的决定。


如果您确实确定这是您所需要的:您可以排除MANIFEST.in中的文件。示例:

project
├── spam
│   ├── __init__.py
│   └── file.txt
├── MANIFEST.in
└── setup.py

MANIFEST.in

exclude spam/file.txt

setup.py

from setuptools import setup

setup(
    name='spam',
    version='0.1',
    packages=['spam'],
    package_data={'spam': ['file.txt']},
)

飞轮:

$ python setup.py bdist_wheel >/dev/null 2>&1 && unzip -l dist/spam-*.whl | grep file.txt
    0  04-17-2019 21:25   spam/file.txt

构建源dist:

$ python setup.py sdist --formats=zip >/dev/null 2>&1 && unzip -l dist/spam-*.zip | grep file.txt
<empty>