extends
Im Buildout-Abschnitt können mit extends mehrere Konfigurationsdateien eingebunden werden. Auf diese Weise können dann auch umfangreiche Konfigurationen, wie z.B. die Installation der libxml2- und libxslt-Bibliotheken in eine eigene Konfigurationsdatei lxml.cfg mit folgendem Inhalt ausgelagert werden:
[lxml] parts = staticlxml pylxml [pylxml] recipe=zc.recipe.egg interpreter=pylxml eggs= lxml [staticlxml] recipe = z3c.recipe.staticlxml egg = lxml
Anschließend kann diese Konfigurationsdatei mit all ihren Abschnitten in die buildout.cfg-Datei eingebunden werden mit:
[buildout] extends = lxml.cfg parts = ${lxml:parts} …
Es kann auch eine URL angegeben werden, also z.B.:
[buildout] extends = http://www.plone-entwicklerhandbuch.de/plone-entwicklerhandbuch/entwicklungsumgebung/lxml.cfg
Umgekehrt kann auch die buildout.cfg-Datei in eine andere Konfiguration übernommen werden, siehe hierzu Buildout für Produktivserver.
Setuptool-Bugfix
Mit jarn.setuptoolsfixer wird ein Bug in den Setuptools behoben, der auftritt sofern die Homepage oder Download-URL eines Pakets nicht erreichbar ist, das Paket jedoch in PyPI zur Verfügung steht.
Shell-Befehle
Mit plone.recipe.command können Sie eigene Shell-Befehle während der Installation oder des Updates durchführen. Somit können Sie zum Beispiel der Zope-Instanz externe Methoden im Verzeichnis parts/instance/Extension zur Verfügung stellen:
[extensions] recipe = plone.recipe.command command = ln -sf ${buildout:directory}/Extensions/* ${instance:location}/Extensions/ update-command = ${extensions:command}
Python-Skripte
buildout.extensionscripts erlaubt die Verwendung von Python-Skripten als Buildout-Erweiterungen.
Die Buildout-Konfiguration kann dann z.B. so aussehen:
[buildout] extensions = … buildout.extensionscripts … extension-scripts = ${buildout:directory}/buildout-utils.py:patchScriptGeneration
Und buildout-utils.py kann dann z.B. so aussehen:
# Workaround for https://bugs.launchpad.net/zc.buildout/+bug/164629 def patchScriptGeneration(buildout): from zc.buildout import easy_install if not 'sys.exit(' in easy_install.script_template: easy_install.script_template = easy_install.script_template.replace( "%(module_name)s.%(attrs)s(%(arguments)s)", "sys.exit(%(module_name)s.%(attrs)s(%(arguments)s))")
User-crontab
Das Rezept z3c.recipe.usercrontab ändert die crontab-Einträge des Nutzers. So kann z.B. für den @reboot-Eintrag folgendes in der buildout.cfg-Datei angegeben werden:
[buildout] … parts = … crontab [crontab] recipe = z3c.recipe.usercrontab times = @reboot command = ${buildout:directory}/bin/instance start
Dabei kann eine Buildout-Konfigurationsdatei auch mehrere crontab-Abschnitte enthalten.
Templates verwenden
Mit collective.recipe.template lassen sich Textdateien aus Vorlagen erstellen wobei die buildout-Variablen verwendet werden können. Hierzu wird in der buildout.cfg-Datei z.B. folgender neuer Abschnitt definiert:
[buildout] parts = … logrotate … [logrotate] recipe = collective.recipe.template input = templates/logrotate.conf output = ${buildout:directory}/etc/logrotate.conf
Und wenn ein Auszug aus templates/logrotate.conf-Datei so aussieht:
… ${buildout:directory}/var/log/instance.log { postrotate ${buildout:bin-directory}/instance logreopen endscript }
sieht dieser Auszug in der generierten Datei myproject/etc/logrotate.conf so aus:
… /home/veit/myproject/var/log/instance.log { postrotate /home/veit/myproject/instance logreopen endscript }