问题
I am using setuptools to build a number of data files (compiled translations,
icons resized and converted into different formats, etc.) and I would like to include the sources of these data files in to sdist and the build results but not their sources and and intermediary files into bdist_wheel.
When I use package_data both sources, intermediary files and built files will be included into bdist_wheel. E.g. translation sources (.ts) are compiled into .qm files then included as part of a rcc bundle, so bdist includes three copies of the translations in different formats and the same happens with icons.
Is there any way to prevent this when using setuptools, i.e. have sdist include data files in their source format and bdist_wheel include only the built results without the sources?
回答1:
Include your directories in MANIFEST.in (see the docs), it's exactly for sdist distribution. Don't use include_package_data = True in setup.py because that includes files from MANIFEST.in into bdist distributions.
回答2:
Further down is a minimal example showing how to achieve both:
- packaging a data file
file.srcinsdistonly; - and packaging another data file
file.bininbdistonly; - additionally it shows how
file.allis packaged in both distribution packages andfile.notin none of them.
The gist of it is:
- first and foremost, always thoroughly clean up the working directory between two packaging attempts while tweaking these packaging options (in particular empty the
src/Thing.egg-infodirectory containing theSOURCES.txtfile as well as thebuild, anddistdirectories) or the results will be inconsistent; - set the
include_package_dataoption toTrue; file.alland files that belong in bothsdistandbdistare specified inMANIFEST.in;file.binand files that belong inbdistonly are specified inpackage_data;file.srcand files that belong insdistonly are specified in bothMANIFEST.inandexclude_package_data;file.notand files that do not belong in any distribution package are not specified anywhere.
The directory structure for our example:
.
├── MANIFEST.in
├── setup.py
└── src
└── thing
├── __init__.py
└── data
├── file.all
├── file.bin
├── file.not
└── file.src
In MANIFEST.in:
recursive-include src/thing *.all
recursive-include src/thing *.src
In setup.py:
#!/usr/bin/env python3
import setuptools
setuptools.setup(
package_data={'thing': ['data/*.bin']},
exclude_package_data={'thing': ['data/*.src']},
include_package_data=True,
#
name='Thing',
version='1.0.0',
package_dir={'': 'src'},
packages=setuptools.find_packages(where='src'),
)
This has been tested with:
- Python 3.6.7
- setuptools 39.0.1
- wheel 0.33.1
来源:https://stackoverflow.com/questions/54867650/is-it-possible-to-exclude-data-file-sources-and-intermediary-files-from-bdist