[Distutils] EasyInstall: Issue: installing versioned modules by default, specifying version at runtime, lazy load highest by default.
Phillip J. Eby
pje at telecommunity.com
Fri Jun 17 18:01:08 CEST 2005
At 01:35 PM 6/17/2005 +0100, Clayton Brown wrote:
>Sometime ago, well at least before this modern marvel of eggs/easy
>install etc, I wrote / adapted a bootstrap loader to enable module
>versioning / specification at time of import, its default behaviour
>was to load the highest version at the level of specification eg.
>
>_foo_version__ == "1.2.3" will load 1.2.3.99 etc where one exists
>but no specification will import 99.99.99.99 etc.
>
>ref: http://claytonbrown.com/cbwiki/ModuleVersioning /
>http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/285215
>
>could the easy_install / import mechanism accomodate such installation
>/ import hooks, (perhaps by just importing a module to invoke this
>behaviour) so that by default eggs are all installed and versioned,
>and if no version is specified by using require the highest version is
>loaded, and when require() is used unless exact version is specified
>it will import higher versions at the depth of specification should
>they become available. Though by the looks of pkg_resources.require()
>this may just be for system binary dependancies, not modules.
>
>my idea is that it would be nice to use -m on every installed package
>to get versioned modules in site-packages, but not force require()
>within scripts,just default to importing highest released version if
>require() doesn't specifify a differnet version.
When EasyInstall installs a script, it actually installs a stub that
effectively require()s the coresponding egg, then runs the original
script. So, you don't actually have to use require() at all, if you use
EasyInstall to install some existing project's distribution. The exact
version that supplied the scripts will be require()d for you automatically.
require() is really only intended to bootstrap activation of the script's
distribution; it isn't intended to be used throughout an application
anyway. One very important reason why not, is that require() embedded in
modules is not discoverable. There is no way to automatically find out
what versions of things a package requires, and thereby automatically
install those versions, if it is buried in code. This is why eggs have a
depends.txt file where all the dependencies are centrally listed, allowing
automated tools to deal with them. These dependencies are based on project
names, not on individual modules or packages, because project names are
discoverable (e.g. via PyPI) and package names are potentially far more
numerous.
So, although your approach has lots of merit, it doesn't accomplish the
larger goal for Eggs, which is to support upgradeable applications and
application servers, and to make it easy to add/remove Python packages from
an application or Python installation. Versioned importing is just the tip
of the iceberg for eggs, something that almost falls out as a side effect,
rather than being a direct goal. Really, eggs more have the goal of
*eliminating the need* for versioned importing, rather than implementing
it! :)
More information about the Distutils-SIG
mailing list