[Distutils] should setuptools be an implicit dependency of every egg?
Jim Fulton
jim at zope.com
Tue Sep 19 14:11:41 CEST 2006
On Sep 19, 2006, at 5:43 AM, Martijn Faassen wrote:
> Hi there,
>
> Normally setuptools is installed system-wide. When you install an egg
> using easy_install, the egg itself can count on setuptools being
> available, and use for instance its resource management API and
> namespace package marking facility. It therefore is unnecessary to
> users
> to mark setuptools as a dependency to their eggs in setup.py. Since
> it's
> unnecessary, it'll just not be done.
>
> This works fine in the case of system-wide installation of setuptools,
> but when installing eggs locally, such as in Buildout, this can
> lead to
> problems. Buildout makes sure that only eggs that are dependencies are
> importable when starting up a script. An egg that is depending on
> setuptools implicitly will therefore not have access to setuptools
> facilities.
Note that the scripts generated by zc.buildout don't use
pkg_resources to determine the eggs to be loaded at run time. The
needed eggs are computed at install time and their locations are
written into the script. If a script doesn't need setuptools (as
determined from egg dependencies), then setuptools is not included in
the script path. Unfortunately, many eggs that do import
pkg_resurces or setuptools don't bother to list setuptools as a
dependency.
> Telling everybody who makes eggs that use setuptools to please take
> Buildout into account and include setuptools as an explicit dependency
> in setup.py seems like a hopeless exercise, as things will just plain
> work for most egg users and developers, at least until the possible
> eventuality of Buildout reaching critical mass in the community.
I would put this differently. I would ask people to be accurate
about their dependencies rather than implicitly assuming that
setuptools is around.
> What would work for Buildout, and as far as I can see does no harm to
> everybody else, is to make setuptools an implicit dependency of all
> eggs. It won't affect anyone else (but for a hopefully tiny
> performance
> impact) as setuptools is definitely available on the system when
> installing the egg through easy_install anyway.
setuptools is avaialble to buildout, because buildout uses it. The
small downsides of making setuptools an implicit dependency of every
egg is that:
- setuptools will be included in the path of every script even when
not needed. This probably has a tiny performance penalty.
- setuptools will be downloaded an installed in some cases where it
isn't needed. zc.buildout can install scripts for versions of Python
other than that used to run zc.buildout. For example, you could run
zc.buildout with Python2.4 and asl it to install a Python 2.3
script. We actually do this on occasion when we use buildout to
install applications that don't support Python 2.4. These
applications generally don't use setuptools, but I might still have
to install setuptools just because we consider every egg, implicitly
to depending on it.
These downsides are, in practice, pretty minor. My main objection is
that I don't like encouraging people to be sloppy about
dependencies. The counter argument, of course, is that the standard
library is an implicit dependency and we are behaving as if
setuptools is part of the standard library.
> So, would this be something that could be added to setuptools?
Nothing would have to change in setuptools. If we agree that
setuptools is an implicit requirement of every egg, even if the egg
never imports anything from the setuptools egg, then I'll modify
zc.buildout to include setuptools in the path of every script.
Jim
--
Jim Fulton mailto:jim at zope.com Python Powered!
CTO (540) 361-1714 http://www.python.org
Zope Corporation http://www.zope.com http://www.zope.org
More information about the Distutils-SIG
mailing list