在buildout时如果组件的requires.txt文件没有pin依赖组件版本号,zc.buildout总是从pypi中取回最新版本,以前在使用Plone 3.3.5时被这个特性害的不轻,就算组件中新版本已明确说明已经不支持python2.4,(甚至不支持python2.5、python2.6),在明知运行的是python2.4的情况下,zc.buildout也会将最新版本组件构建为一个不能用的egg,不报任何错误,说明pypi中没有记录组件对python最低版本要求的信息。在[versioins]下pin住相关组件的版本号成为非常痛苦的一件事。参考下面的文章
https://maurits.vanrees.org/weblog/archive/2010/04/nonewplone
如果同一组件pin过不同的版本,你会发现eggs目录中有多个冲突版本,但Plone只使用最后buildout时pin的版本,那么猜测一定在某个地方记录了使用的egg信息,用grep搜索了一下,对于Plone5.1.2的zeo缺省安装情况下,以下六个文件中记录了使用的egg位置和版本号
/opt/plone/zeocluster/bin/client2
/opt/plone/zeocluster/bin/client1
/opt/plone/zeocluster/bin/zopepy
/opt/plone/zeocluster/parts/client2/bin/interpreter
/opt/plone/zeocluster/parts/client1/bin/interpreter
前一段时间都是拷贝出文本信息在EXCEL中用减号“-”分列来制作组件和版本号,在网上找到一篇文章,提供了高效的方法
https://davidjb.com/blog/2011/06/extracting-a-buildout-versions-cfg-from-a-zope-instance-script/
正好适用,现将命令行记录一下(稍微修改了一下)
cat /opt/plone/zeocluster/bin/zopepy | grep eggs | sed -r 's#.*eggs/(.*)-py2.[0-9].*#\1#g' | sed -r 's#-# = #g' | sed -r 's#_#-#g' | grep -E ' = [0-9\.]' | xargs -0 echo -e "[versions]\n" | sed -r 's#^\s+##g' >> /opt/plone/zeocluster/buildout.cfg
另外几篇参考文章
https://maurits.vanrees.org/weblog/archive/2008/01/easily-creating-repeatable-buildouts
https://maurits.vanrees.org/weblog/archive/2008/01/creating-repeatable-buildouts
https://maurits.vanrees.org/weblog/archive/2010/08/fake-version-pinning