Zope2 和另一个 zope.* 包之间的 ZCML 配置冲突

ZCML configuration conflict between Zope2 and another zope.* package

我有一个 Plone 附加组件 setup.py

setup(
    ...
    install_requires=[
        ...
        'zope.i18n',
        ...
        'Zope2',
    ],
    ...
)

如果我 运行 bin/instance 我得到以下回溯:

  File ".buildout/eggs/zope.configuration-3.7.4-py2.7.egg/zope/configuration/config.py", line 1527, in resolveConflicts
    raise ConfigurationConflictError(conflicts)
zope.configuration.config.ConfigurationConflictError: Conflicting configuration actions
  For: ('utility', <InterfaceClass zope.i18n.interfaces.INegotiator>, '')
    File ".buildout/eggs/zope.i18n-3.7.4-py2.7.egg/zope/i18n/configure.zcml", line 3.2-6.8
        <utility
            provides="zope.i18n.interfaces.INegotiator"
            component="zope.i18n.negotiator.negotiator"
            />
    File ".buildout/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/i18n.zcml", line 5.2-8.8
        <utility 
            provides="zope.i18n.interfaces.INegotiator"
            component="zope.i18n.negotiator.negotiator"
            />

如果我从 setup.py 中注释掉 zope.i18n,再次 运行 buildout,那么实例将正常启动。

令人惊讶的是,两个 bin/instance 文件(删除 zope.i18n 之前和之后)完全 相同。

所以我对在 setup.py 上定义的东西有什么问题一无所知,无论如何都选择了相同的版本...

最后一点,在发行版的主要部分 configure.zcml 我有这一行:

<includeDependencies package="." />

这有关系吗?

这似乎很奇怪??显然不可能对同一个实用程序进行两次注册,但是两个包都可以吗?我对此很困惑。通常你不需要 <includeDependencies package="." /> 部分,因为所有组件都应该由 z3c.autoinclude 的 plone 入口点加载。我假设在默认的 plone 环境中,不会加载其中一个组件。

我签到的是Plone 4.3.6...使用的是zope.i18n的Negotiator

所以我最好的选择是,您的 <includeDependencies package="." /> 还加载了 Zope2 的 configure.zcml,这不应该发生。

删除 <includeDependencies package="." />,可能会解决您的问题。