1

这就是问题所在。我有mynamespace.mypackage它作为依赖项mynamespace.mydependencypackage,即本地实用程序。它是使用组件注册表注册的。

config.pymynamespace.mypackage我有

DEPENDENCIES = ['mynamespace.mydependencypackage']

如果尚未安装,则在我mynamespace.mypackage的 's中安装此依赖项。setuphandlers.py

问题是:如果我mynamespace.mypackage通过重新安装ZMI,一切似乎都可以完美安装(因为没有显示错误)但是我在使用获取实用程序的ComponentLookupError方法时不断得到一个:mynamespace.mypackage

Module zope.component._api, line 207, in getUtility
ComponentLookupError: (<InterfaceClass MY_UTILITY_INTERFACE, '')

mynamespace.mydependencypackage我可以通过在我的setuphandlers.py或通过 ZMI 重新安装以及在重新安装时重新安装来“解决”这个问题,mynamespace.mypackage但这对我来说似乎不是最好的解决方案。

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

编辑:现在,我有一个更大的问题。TypeError: ('object.__new__(MyClass) is not safe, use Persistence.Persistent.__new__()', <function _reconstructor at 0xb7783e9c>, (<class 'mynamespace.mydependencypackage.package.MyClass'>, <type 'object'>, None))正在显示。完整追溯:

Traceback (innermost last):
  Module ZPublisher.Publish, line 110, in publish
  Module ZPublisher.BaseRequest, line 429, in traverse
  Module ZPublisher.BeforeTraverse, line 99, in __call__
  Module Products.CMFCore.PortalObject, line 94, in __before_publishing_traverse__
  Module zope.event, line 23, in notify
  Module zope.component.event, line 26, in dispatch
  Module zope.component._api, line 130, in subscribers
  Module zope.component.registry, line 290, in subscribers
  Module zope.interface.adapter, line 535, in subscribers
  Module zope.component.event, line 33, in objectEventNotify
  Module zope.component._api, line 130, in subscribers
  Module zope.component.registry, line 290, in subscribers
  Module zope.interface.adapter, line 535, in subscribers
  Module zope.app.component.site, line 375, in threadSiteSubscriber
  Module zope.app.component.hooks, line 61, in setSite
  Module Products.CMFCore.PortalObject, line 75, in getSiteManager
  Module ZODB.Connection, line 761, in setstate
  Module ZODB.Connection, line 819, in _setstate
  Module ZODB.serialize, line 604, in setGhostState
  Module ZODB.serialize, line 597, in getState
  Module copy_reg, line 48, in _reconstructor
TypeError: ('object.__new__(MyClass) is not safe, use Persistence.Persistent.__new__()', <function _reconstructor at 0xb7783e9c>, (<class 'mynamespace.mydependencypackage.package.MyClass'>, <type 'object'>, None))
4

1 回答 1

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

于 2011-08-01T15:28:57.943 回答