[Distutils] Improving setuptools bootstrapping

Phillip J. Eby pje at telecommunity.com
Sat Sep 2 01:35:16 CEST 2006


So, I've been giving some thought to how setuptools does its bootstrap 
installation.

One potentially-significant problem is that people are often installing 
older versions, because of old copies of ez_setup.py being distributed in 
people's packages.

Right now, ez_setup.py is used for two purposes.  First, you can include it 
in a source package in order to be able to use setuptools.  Second, it's 
also used as a way of installing setuptools in a standalone setting.

In both cases, there are two possibilities regarding the target machine: it 
may have network access, or it may not.  If it does have access, the 
current approaches basically work okay, except for the versioning 
issue.  If network access isn't available, however, it annoys users who are 
trying to install a setuptools-based package who don't already have 
setuptools.  (Thus creating a bad impression for both setuptools *and* the 
package using it.)

This isn't likely to remain a problem in the long term.  As setuptools 
stabilizes, it will be more likely that the user already has a current and 
stable setuptools version installed.  A later version of Python might even 
bundle it, and it's also relatively easy to create system packages of 
setuptools now.

For example, I could go back to building .exe installers for Windows, and 
perhaps throw in Linux RPMs as well.  (And perhaps get contributed Mac OS 
packages too.)  Back when the current ez_setup.py system was created, this 
wasn't an option because system packages of eggs weren't well-supported, 
and version conflicts could occur if you tried to also install the egg 
version of something.  But none of these things are issues any more.

So it's possible that we could start phasing out ez_setup's automatic 
downloading, in favor of simply requesting that setuptools be installed first.

The advantage is that ez_setup would become simpler and more stable, 
without version skew in its distributed versions.  The disadvantage is that 
it requires an extra step to install, which might discourage user or 
developer adoption.

But adoption appears to be quite widespread now; the Cheeseshop shows tens 
of thousands of downloads of setuptools 0.6c1 alone!

So, perhaps we should move to doing something like this: when you run a 
setup.py that's using ez_setup(), and it appears necessary to 
download/install setuptools, a message is displayed, something like:

----------------------------------------------------------------
setuptools >= 0.6c1 not found

Please install or upgrade the setuptools package before running
this script; see http://cheeseshop.python.org/pypi/setuptools
for downloads.
----------------------------------------------------------------

If there's a version of setuptools already on the machine, the message 
could also add something like this at the end:

   You may be able to upgrade your current installation of
   setuptools using 'easy_install -U setuptools'.

This would reduce ez_setup.py to hardly any code at all.

Pros:
   * Net-less installs are less painful
   * Users don't get surprised by "setup.py install" trying to access the net
   * No version skew or missing version issues
   * Users can install system packages (RPM, .exe, etc.) of setuptools

Cons:
   * Manual step for new setuptools adopters (but who's left?)
   * Might break setuptools-wrapping programs (like zc.buildout and 
Enstaller) if they rely on ez_setup
   * Developers might not want to switch to this new approach, if they feel 
the manual step is unwieldy


Does anybody have any thoughts on this, one way or the other?



More information about the Distutils-SIG mailing list