buildout / buildout

Buildout is a deployment automation tool written in and extended with Python
http://www.buildout.org
Other
570 stars 168 forks source link

Recipe feature error, depending on part order #620

Closed reinhardt closed 1 year ago

reinhardt commented 1 year ago

When I use a recipe in two buildout parts, once plain and once with support for some feature, I get an error if the part with the plain usage is built first.

Workaround: If I swap the part order, or declare the feature in both parts, the error goes away.

Example buildout.cfg:

[buildout]
parts =
    first
    second

[first]
recipe = collective.recipe.template
input = ${buildout:directory}/first.tmpl
output = ${buildout:directory}/first.out

[second]
recipe = collective.recipe.template[genshi]:genshi
input = ${buildout:directory}/second.tmpl
output = ${buildout:directory}/second.out

gives me:

$ bin/buildout
Creating directory '/tmp/eggs/'.
Getting distribution for 'collective.recipe.template'.
Got collective.recipe.template 2.2.
Getting distribution for 'six'.
Got six 1.16.0.
While:
  Installing.
  Getting section second.
  Initializing section second.

An internal error occurred due to a bug in either zc.buildout or in a
recipe being used:
Traceback (most recent call last):
  File "/tmp/lib/python3.9/site-packages/zc/buildout/buildout.py", line 2183, in main
    getattr(buildout, command)(args)
  File "/tmp/lib/python3.9/site-packages/zc/buildout/buildout.py", line 709, in install
    [self[part]['recipe'] for part in install_parts]
  File "/tmp/lib/python3.9/site-packages/zc/buildout/buildout.py", line 709, in <listcomp>
    [self[part]['recipe'] for part in install_parts]
  File "/tmp/lib/python3.9/site-packages/zc/buildout/buildout.py", line 1332, in __getitem__
    options._initialize()
  File "/tmp/lib/python3.9/site-packages/zc/buildout/buildout.py", line 1440, in _initialize
    self.initialize()
  File "/tmp/lib/python3.9/site-packages/zc/buildout/buildout.py", line 1449, in initialize
    self.recipe = recipe_class(buildout, name, self)
  File "/tmp/eggs/collective.recipe.template-2.2-py3.9.egg/collective/recipe/template/__init__.py", line 70, in __init__
    self._execute()
  File "/tmp/eggs/collective.recipe.template-2.2-py3.9.egg/collective/recipe/template/genshitemplate.py", line 7, in _execute
    from genshi.template import Context, NewTextTemplate
ModuleNotFoundError: No module named 'genshi'

Versions:

Package     Version
----------- -------
pip         22.0.4
setuptools  42.0.2
wheel       0.37.1
zc.buildout 2.13.8

This works (swapped part order):

[buildout]
eggs-directory = /tmp/eggs/
parts =
    second
    first

[first]
recipe = collective.recipe.template
input = ${buildout:directory}/first.tmpl
output = ${buildout:directory}/first.out

[second]
recipe = collective.recipe.template[genshi]:genshi
input = ${buildout:directory}/second.tmpl
output = ${buildout:directory}/second.out

This also works (declared genshi feature without using it):

[buildout]
eggs-directory = /tmp/eggs/
parts =
    first
    second

[first]
recipe = collective.recipe.template[genshi]
input = ${buildout:directory}/first.tmpl
output = ${buildout:directory}/first.out

[second]
recipe = collective.recipe.template[genshi]:genshi
input = ${buildout:directory}/second.tmpl
output = ${buildout:directory}/second.out
mauritsvanrees commented 1 year ago

There is collective.recipe.genshi as wrapper around collective.recipe.template to fix this. Well, to work around this. It points to a Buildout bug in Launchpad.

Reported on GitHub as well in issue #155. So I close this as a duplicate.