I'm fairly new to setuptools. I've seen a few similar questions and it drives a little bit insane that I've seemed to follow advice I saw but setuptools still does something different than what I want.
Here is the structure of my project:
.
..
package1/
__init__.py
abc.py
...
tests/
__init__.py
test_package1.py
LICENSE
README.md
RELEASE
setup.py
And here is the contents of my setup.py:
#!/usr/bin/env python
import os
#from distutils.core import setup
from setuptools import setup, find_packages
setup(
name='package1',
version='1.1',
test_suite="tests",
packages=find_packages(exclude=['tests']),
include_package_data=True,
package_data = {
'': ['LICENSE', 'README.md5', 'RELEASE']
},
)
Also, in my manifest file I have:
include LICENSE
include RELEASE
include README.md
I build the tar with:
python setup.py sdist
I want to:
- Exclude
tests
directory from the source distribution;
- Have LICENSE, README.md, RELEASE files in the site-packages directory, either at the top level, or inside the package1 directory (at this point I will agree to either).
Instead, here's what happens:
tests
directory remains to be in the created tar archive and gets installed to the site-packages;
- Files are copied to the archive, but do not get installed to the site-packaged directory of the package.
I am out of ideas, can someone explain to me what I am doing wrong and how to fix it?
You should create a new file called MANIFEST.in
in the root level of your package, then follow these instructions:
To control which files end up in your tar file, create a new file called MANIFEST.in
in the root level of your package. For example, you can exclude whole directories from your distribution, using recursive-exclude
in the MANIFEST.in
file. In your case, you need your MANIFEST.in
file to contain:
recursive-exclude tests *
It's not common to include README and other files in the site-packages directory, but if you really want to, then go inside package1
and create symbolic links to the files you want to include:
cd package1
ln -s ../LICENSE
ln -s ../README.md
ln -s ../RELEASE
Then change the following line in your setup.py:
package_data = {
'': ['LICENSE', 'README.md', 'RELEASE']
to:
package_data = {
'package1': ['LICENSE', 'README.md', 'RELEASE']
find_packages
uses fnmatchcase
for its exclude filtering. You can test if your exclusion pattern matches a package name as follows:
>>> from fnmatch import fnmatchcase
>>> fnmatchcase('my.package.name.tests', 'tests')
False
Assuming all the tests in your project live in package names ending in tests
or subpackages of those packages, the following should suffice to exclude all the test code:
setup(
name='package1',
version='1.1',
packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']),
)
To also exclude the tests
folder from source distributions, add the following to MANIFEST.in:
recursive-exclude tests *
if your structure is true:
- the tests folder is not a package (it doesn't have the init.py file), so find_package don't exclude it.
- include_package_data=True mean that all versionned files will be included if not explicitly excluded .
so : try an exclude tests/* in your MANIFEST.in
I Hope it had helped
MANIFEST.in would take care of it.
prune tests/
include LICENSE README.md RELEASE
if you have static files to be added, add them with
...
recursive-include package1/static *
I was trying everything and nothing seemed to work, until I deleted the build
directory (after seeing another answer mentioning *.egg-info/
directory) and it finally worked. python setup.py clean --all
should also do the job.