[Distutils] Specifying version information once

Jean-Paul Calderone exarkun at divmod.com
Wed May 20 05:05:30 CEST 2009

On Wed, 20 May 2009 10:17:31 +1000, Ben Finney <ben+python at benfinney.id.au> wrote:
>Jean-Paul Calderone <exarkun at divmod.com> writes:
>> For a long time, the idiom I've used to specify version information in my
>> distutils-based packages has been this simple one: put version information
>> into the Python package somewhere, structure the source layout so that the
>> package can be imported directly from an unpacked source tarball (or vcs wc),
>> and import the version into setup.py.  This worked great.  And I only had to
>> define my version once.
>> Increasingly, it seems that new distutils-related tools don't support this
>> idiom and break in various ways.  (eg
>>  http://divmod.org/trac/ticket/2629
>>  http://divmod.org/trac/ticket/2831
>> )
>Those breakages seem to be caused in part because the module containing
>version information is doing too much.

The only thing the version module does is define the version.  For example,

  $ cat _version.py
  # This is an auto-generated file. Use Epsilon/bin/release-divmod to update.
  from twisted.python import versions
  version = versions.Version(__name__[:__name__.rfind('.')], 0, 9, 33)

Of course, the "too much" here is the use of a structured version object.
Doing anything simpler would be much like the approach Phillip's pointed
out, to have a simple text file and parse its contents without getting
Python involved at all.

>> What is the recommendation for specifying version information in a way
>> which is compatible with all these new tools?
>I would recommend having a module in your package whose *only*
>responsibility is version information for the package, so that importing
>it won't break in different environments.
>That module can the be imported both by the package itself when it needs
>to know its version string, and by the ‘setup.py’ to get that same
>version string for package building.

This has issues.  For examples, sometimes a system-wide installation of the
package will get used instead (generally not when running setup.py directly,
but it seems to happen when other tools are used).  Otherwise, the existing
_version.py from above works fine.


More information about the Distutils-SIG mailing list