buildout2.x で appfy.recipe.gae を動かす方法

昨日、@yuitowest に Interactive Shell for blockdiag のデザイン調整を依頼したときに気づいたのですが、
buildout で Google AppEngine の開発環境を整えるためのレシピである appfy.recipe.gae が buildout 2.x系では動作しなくなっていました。

具体的には buildout を実行すると以下のエラーが出ます。

$ bin/buildout -N
While:
  Installing.
  Getting section app_lib.
  Initializing section app_lib.
  Loading zc.buildout recipe entry appfy.recipe.gae:app_lib.

An internal error occured due to a bug in either zc.buildout or in a
recipe being used:
Traceback (most recent call last):
  File "/Users/tkomiya/.buildout/buildout-eggs/zc.buildout-2.1.1-py2.7.egg/zc/buildout/buildout.py", line 1921, in main
    getattr(buildout, command)(args)
  File "/Users/tkomiya/.buildout/buildout-eggs/zc.buildout-2.1.1-py2.7.egg/zc/buildout/buildout.py", line 486, in install
    [self[part]['recipe'] for part in install_parts]
  File "/Users/tkomiya/.buildout/buildout-eggs/zc.buildout-2.1.1-py2.7.egg/zc/buildout/buildout.py", line 1084, in __getitem__
    options._initialize()
  File "/Users/tkomiya/.buildout/buildout-eggs/zc.buildout-2.1.1-py2.7.egg/zc/buildout/buildout.py", line 1188, in _initialize
    self.initialize()
  File "/Users/tkomiya/.buildout/buildout-eggs/zc.buildout-2.1.1-py2.7.egg/zc/buildout/buildout.py", line 1194, in initialize
    recipe_class = _install_and_load(reqs, 'zc.buildout', entry, buildout)
  File "/Users/tkomiya/.buildout/buildout-eggs/zc.buildout-2.1.1-py2.7.egg/zc/buildout/buildout.py", line 1153, in _install_and_load
    req.project_name, group, entry)
  File "/Users/tkomiya/bin/python/lib/python2.7/site-packages/pkg_resources.py", line 357, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/Users/tkomiya/bin/python/lib/python2.7/site-packages/pkg_resources.py", line 2394, in load_entry_point
    return ep.load()
  File "/Users/tkomiya/bin/python/lib/python2.7/site-packages/pkg_resources.py", line 2108, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/Users/tkomiya/.buildout/buildout-eggs/appfy.recipe.gae-0.9.3-py2.7.egg/appfy/recipe/gae/app_lib.py", line 70, in <module>
    from z3c.recipe.scripts.scripts import Scripts
  File "/Users/tkomiya/.buildout/buildout-eggs/z3c.recipe.scripts-1.0.1-py2.7.egg/z3c/recipe/scripts/__init__.py", line 1, in <module>
    from z3c.recipe.scripts.scripts import Scripts, Interpreter
  File "/Users/tkomiya/.buildout/buildout-eggs/z3c.recipe.scripts-1.0.1-py2.7.egg/z3c/recipe/scripts/scripts.py", line 19, in <module>
    from zc.recipe.egg.egg import ScriptBase
ImportError: cannot import name ScriptBase

エラーの原因は z3c.recipe.scripts は buildout2 には対応していないために起きているようです。
(zc.recipe.egg に機能がマージされた?

自分の開発環境ではうまく動いているのに…と思っていたのは、単に手元では buildout 1.7.1 で動かしていたからだったんですね。

今後どうすればいいの?

appfy.recipe.gae のリポジトリ を見ると buildout_2 というブランチがあり、ここでは zc.recipe.egg を使うよう変更されています。

この変更はまだリリースされていないので、buildout.cfg で github リポジトリを指定することで利用することができます。

[buildout]
find-links = https://github.com/prmtl/appfy.recipe.gae/tarball/buildout_2#egg=appfy.recipe.gae-0.9.4
versions = versions

[versions]
appfy.recipe.gae=0.9.4

手元ではこの設定で buildout2 上で動作させることができました。


ちなみに、試していないものの rod.recipe.appengine というものもあるようです。
今年に入っても何度かリリースされているし、History に zc.recipe.eggs という文字が見えるので、こちらでも行けるかもしれません。