[Distutils] install_recommends proposal

Martijn Faassen faassen at startifact.com
Wed Sep 26 22:38:49 CEST 2007


Michael Hoffman wrote:
> Martijn Faassen wrote:
>> Hi there,
>>
>> Currently setup.py allows install_requires to specify the dependencies, 
>> possibly including exact version numbers of a package.
>>
>> It is however beneficial to only specify the *minimum* of expected 
>> requirements in there, to retain maximum flexibility of use. This means 
>> you'd typically say:
>>
>>    install_requires = [
>>       'foo',
>>       'bar >= 1.3',
>>    ]
>>
>> if you know you need some version of foo, and at least version 1.3 of 
>> your package. This allows developers who use your package to choose 
>> themselves which version of foo and bar they want to use, without 
>> getting version conflicts as long as you stay within the stated constraints.
> 
> Can't you use the extras_require feature for this?

It is my understanding that extra_requires is used to express *extra*, 
optional requirements beyond those in install_requires. That's not at 
all what I'm trying to talk about, so my apologies for being so unclear.

install_recommends as I proposed it would be used to offer 
recommendations for the core requirements (or, I guess, also 
recommendations of versions for the extra requirements if desired). So, 
the exact same requirements are expressed, just with an additional 
tightening of version numbers.

I understand how the name "install_recommends" could be confusing 
terminology given the way package managers use the term 'recommended 
packages', which means extra that you could install too to get more 
features. "install_prefers" instead?

An alternative would be to expand the syntax of install_requires and 
extra_require to allow the recommended version number hint. Something 
like this:

install_requires = [
    'foo (1.2.1)',
    'bar >= 1.3 (1.3.2)',
   ]

Installation tools are free to ignore the latter number and just install 
something that fits the basic requirement:

install_requires = [
   'foo',
   'bar >= 1.3',
]

But an installation could be taught to take this into account and get 
those versions, and do the equivalent of this:

install_requires = [
    'foo == 1.2.1',
    'bar == 1.3.2',
   ]

The install tool could choose in the case of conflicting version numbers 
to pick the one in the outer packages. So, if foo depends on bar, and 
bar says it would prefer qux 1.3, while foo actually prefers 1.3.2, foo 
would trump bar.

Again, all this would be entirely optional behavior of the installation 
tool. I'm just asking for a way to express this information in the 
package metadata at all, so that install tools could be taught to use it.

Regards,

Martijn



More information about the Distutils-SIG mailing list