I have a django project with this kind of architecture :
I wanted to deploy it in a .egg without my 'dev.py' files. I tried different ways : first, with a
find_packages(exclude=['*.dev','dev'])
, then with a MANIFEST.in which contains :
global-exclude dev.py
The second solution seems to work when I do a sdist - with this warning when I install it :
warning: no previously-included files matching 'dev.py' found anywhere in distribution
, but does'nt work with a bdist-egg.
Here a part of my setup.py :
from setuptools import setup, find_packages
project import VERSION
packages = [
'project',
'project.settings',
'project.urls',
]
setup(name='project',
version=VERSION,
package_dir = {'project' : 'project'},
description = 'My Project',
author = 'Simon Urli',
author_email = '',
url = '',
packages = packages, #find_packages('project',exclude=['*.dev', 'dev']),
)
Note that I use python 2.6.6, maybe it matters. Any idea how to create my egg excluding the dev files properly ?
package_data. By default, include_package_data considers all non .py files found inside the package directory ( src/mypkg in this case) as data files, and includes those that satisfy (at least) one of the above two conditions into the source distribution, and consequently in the installation of your package.
As far as I know, it just removes the the build subdirectory, where Python puts all the files to be installed, including extensions that need to be compiled.
The setup.py file may be the most significant file that should be placed at the root of the Python project directory. It primarily serves two purposes: It includes choices and metadata about the program, such as the package name, version, author, license, minimal dependencies, entry points, data files, and so on.
A Python file that relies only on the standard library can be redistributed and reused without the need to use setuptools. But for projects that consist of multiple files, need additional libraries, or need a specific version of Python, setuptools will be required.
I had the same issue recently (although I had to build a wheel instead of an egg), the solution works the same both for bdist_egg
and bdist_wheel
. You have to override the method find_package_modules
in build_py
:
import fnmatch
from setuptools import find_packages, setup
from setuptools.command.build_py import build_py as build_py_orig
exclude = ['*.dev']
class build_py(build_py_orig):
def find_package_modules(self, package, package_dir):
modules = super().find_package_modules(package, package_dir)
return [(pkg, mod, file, ) for (pkg, mod, file, ) in modules
if not any(fnmatch.fnmatchcase(pkg + '.' + mod, pat=pattern)
for pattern in exclude)]
setup(
packages=find_packages(),
cmdclass={'build_py': build_py},
)
In this example, modules named dev
in all packages will be excluded from the build.
As you can see, there's no need to play with exclusions in find_packages()
as you still need all packages to be included, but instead you filter the module files found in each package. The class build_py
is pretty much generic and could be refactored in a separate library if you need to reuse it; the only project-specific stuff is the list of exclude patterns.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With