While I've already discussed what's generally required for making Plone run with Repoze and mod_wsgi, I had been using Plone 3.3rc3. Anyone (myself included) who's tried to sub in anything more recent (like Plone 3.3rc4) has run into a problem with version conflicts due to changes between 3.3rc3 and 3.3rc4. Specifically the upgrade of five.localsitemanager from 0.4 to 1.1 sets off a zope.component version conflict, as any version of it 1.0 or beyond tries to pull in a whole bunch of eggs that aren't really necessary. Now obviously pinning five.localsitemanager to a version less than 1.0 will allow the buildout to complete properly, but this isn't really a good solution as it creates a mutant (and thus untested) version of Plone that may or may not work in random situations.
The real fix isn't that hard, though. It's simply a matter of utilizing fake Zope 2 eggs. The only catch here is that in order for them to work, they must be in place before the Plone eggs get pulled, but as always they cannot be created until after Zope 2 itself is in place. This necessitates splitting the one Zope part I showed last time into two and sticking a fake eggs part in between. The second part will have to reference the eggs of the first part. To make things just a little more interesting, z3c.recipe.fakezope2eggs expects a location to be provided by the [zope2] part. We thus have to create one. The changed section will look as follows:
[zope2] recipe = zc.recipe.egg dependent-scripts = true location = ${buildout:directory}/parts eggs = lxml repoze.zope2 [zopeliblink] recipe = iw.recipe.cmd on_install = true on_update = true cmds = mkdir -p ${buildout:directory}/parts/lib/python ln -sh ${buildout:directory}/eggs/zopelib*/zope ${buildout:directory}/parts/lib/python/zope [fakezope2eggs] recipe = z3c.recipe.fakezope2eggs [plone] recipe = zc.recipe.egg dependent-scripts = true interpreter = zopepy eggs = ${zope2:eggs} Plone PIL Products.DocFinderTab Products.ExternalEditor plone.openid deliverance repoze.urispace repoze.dvselect mysite.policy
It's probably obvious, but just in case it's not, the two new parts have to be added to the parts section near the top:
parts = lxml zope2 zopeliblink fakezope2eggs plone instance slugs addpaths
Don't forget that the order is important, as the fake Zope eggs have to be created after Zope proper but before Plone.
Deliverance and URISpace should continue to work without changes.
Also, I've created eggs for zopelib 2.10.8.0 and ZODB 3.7.3 (the official versions that the Plone 3.3 builds are based upon; I've also made a zopelib 2.11.3 for people using straight Zope) and submitted them to the Repoze guys for inclusion in their distribution section. If you'd like to play around with these before they become official, you can find them in the Saugus.net distribution section.
I got the thing working with plone.app.blob and all the other products I use, but I had to manually rearrange sys.path in the scripts so zope.proxy and ZODB3 come before zopelib. It would be helpful if zopelib was more modular.
ReplyDeleteHave you tried using zopelib 2.11.x in lieu of zopelib 2.10.x? 2.11 added blob support in its included version of ZODB. You're not alone in wishing zopelib were more modular; the 2.12 series should help a lot in that regard.
ReplyDelete