这就是问题所在。我有mynamespace.mypackage
作为依赖mynamespace.mydependencypackage
,即local utility。它是使用component registry注册的。
来自config.py
的{{1}},我有
mynamespace.mypackage
在我的DEPENDENCIES = ['mynamespace.mydependencypackage']
mynamespace.mypackage
中,如果尚未安装,则会安装此依赖项。
问题是:如果我通过setuphandlers.py
重新安装mynamespace.mypackage
,一切似乎都完美安装(因为没有显示任何错误),但在使用{{1}中的方法时,我一直得到ZMI
得到实用程序:
ComponentLookupError
我可以修复'这个问题,重新安装mynamespace.mypackage
时,重新安装Module zope.component._api, line 207, in getUtility
ComponentLookupError: (<InterfaceClass MY_UTILITY_INTERFACE, '')
或通过ZMI重新安装mynamespace.mydependencypackage
,但这对我来说似乎不是最佳解决方案。
我在这里缺少关于通用设置的内容?我没有让这个实用程序在ZODB上保留任何价值。我可以忘记所有这些问题,并使用实用程序方法创建setuphandlers.py
,但我想先了解为什么会遇到这些问题。
编辑:现在,我有一个更大的问题。正在显示mynamespace.mypackage
。完全追溯:
BrowserView
答案 0 :(得分:5)
听起来您在setuphandlers.py文件中有自定义Python代码来安装依赖项。您是否有理由不注意metadata.xml文件中的依赖项?或者你能告诉我们那段代码吗?
在Plone中激活加载项时,它会对各种实体进行比较之前/之后以支持停用。其中包括本地持久性实用程序,由componentregistry.xml文件定义。注意:GenericSetup xml文件中定义的任何内容都会导致持久更改 - 如果您需要非持久性实用程序,请使用ZCML文件注册它们。
因此,如果您有自定义代码在setuphandlers.py代码中添加本地实用程序,Plone认为此实用程序属于您的主要附加组件。如果您重新安装该附加组件,该实用程序将与其他任何内容一起删除,然后重新安装所有内容。
我猜测你的“已安装”检查失败后重新安装并且不再添加该实用程序。
您可以通过简单地为依赖项和主加载项提供自己的GenericSetup配置文件,而不是在主要的metadata.xml中注意依赖项来避免所有这些,例如:
<?xml version="1.0"?>
<metadata>
<version>1</version>
<dependencies>
<dependency>profile-my.dependency:default</dependency>
</dependencies>
</metadata>
一旦你这样做,依赖关系配置文件将被独立激活,Plone自己跟踪它。如果您随后决定重新安装主加载项,则根本不会触及依赖项并保持不变。