使用本地实用程序作为产品依赖项的问题

时间:2011-08-01 14:39:02

标签: plone utility

这就是问题所在。我有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

我可以修复&#39;这个问题,重新安装mynamespace.mypackage时,重新安装Module zope.component._api, line 207, in getUtility ComponentLookupError: (<InterfaceClass MY_UTILITY_INTERFACE, '') 或通过ZMI重新安装mynamespace.mydependencypackage,但这对我来说似乎不是最佳解决方案。

我在这里缺少关于通用设置的内容?我没有让这个实用程序在ZODB上保留任何价值。我可以忘记所有这些问题,并使用实用程序方法创建setuphandlers.py,但我想先了解为什么会遇到这些问题。

编辑:现在,我有一个更大的问题。正在显示mynamespace.mypackage。完全追溯:

BrowserView

1 个答案:

答案 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自己跟踪它。如果您随后决定重新安装主加载项,则根本不会触及依赖项并保持不变。