We use buildout for all our django projects. Nothing wrong with pip, but buildout has extension possibilities build-in (for creating directories, installing user crontabs, local development checkouts and many more) that are quite helpful. And it works better when you need to use system packages (gdal, mapnik, etc).
One area where buildout could use some improvement was the version conflict reporting. Let’s say you have pinned django to 1.6.6 (old project that I’ll upgrade to 1.8 this week) and you add the django debug toolbar. This is the error you get:
The constraint, 1.6.6, is not consistent with the requirement, 'Django>=1.7'. While: Updating django. Error: Bad constraint 1.6.6 Django>=1.7
First things first. An easy one is to improve the wording of the message:
While: Installing django. Error: The requirement ('Django>=1.7') is not allowed by your [versions] constraint (1.6.6)
Now... so there is some package that requires at least django 1.7. But which one? Buildout did not tell you. Which would mean you’d have to grep in all your requirements’ sub-requirements for which package actually requires the offending “django>=1.7”...
I’ve now added some internal logging that stores which package required which dependency. After an error occurs, the list is searched for possible matches.
With this change you’ll get a much more helpful output right before the error:
Installing django. version and requirements information containing django: [versions] constraint on django: 1.6.6 Base installation request: 'sso', 'djangorecipe' Requirement of djangorecipe==1.10: Django Requirement of djangorecipe==1.10: zc.recipe.egg Requirement of djangorecipe==1.10: zc.buildout Requirement of sso: django-nose Requirement of sso: django-mama-cas Requirement of sso: django-debug-toolbar Requirement of sso: django-auth-ldap Requirement of sso: Django<1.7,>=1.4.2 Requirement of lizard-auth-server: django-nose Requirement of lizard-auth-server: django-extensions Requirement of lizard-auth-server: Django<1.7,>=1.6 Requirement of django-nose: Django>=1.2 Requirement of django-nose: nose>=1.2.1 Requirement of django-mama-cas: requests==1.1.0 Requirement of django-debug-toolbar: sqlparse Requirement of django-debug-toolbar: Django>=1.7 Requirement of django-auth-ldap: python-ldap>=2.0 Requirement of django-auth-ldap: django>=1.1 Requirement of translations: Django>=1.4 Requirement of django-extensions: six>=1.2 While: Installing django. Error: The requirement ('Django>=1.7') is not allowed by your [versions] constraint (1.6.6)
This makes it much easier to spot the cause (in this case django-debug-toolbar).
There are some unrelated packages in here because I’m doing a textual comparison. The advantage is that it is very robust. And extracting the right package name from requirements without messing things up is harder to get right and takes more code.
So... if you use buildout, give version 2.5.0 a try!
My name is Reinout van Rees and I work a lot with Python (programming language) and Django (website framework). I live in The Netherlands and I'm happily married to Annie van Rees-Kooiman.
Most of my website content is in my weblog. You can keep up to date by subscribing to the automatic feeds (for instance with Google reader):