这是问题所在.我有mynamespace.mypackage一个依赖mynamespace.mydependencypackage,这是一个本地实用程序.它是使用组件注册表注册的.
在config.py从mynamespace.mypackage,我有
DEPENDENCIES = ['mynamespace.mydependencypackage']
Run Code Online (Sandbox Code Playgroud)
在我mynamespace.mypackage的setuphandlers.py这个依赖项中安装,如果尚未安装.
问题是:如果我重装mynamespace.mypackage过ZMI,似乎一切都完美地安装(因为显示没有错误),但我不断收到一个ComponentLookupError使用的方法时,mynamespace.mypackage即获得该实用程序:
Module zope.component._api, line 207, in getUtility
ComponentLookupError: (<InterfaceClass MY_UTILITY_INTERFACE, '')
Run Code Online (Sandbox Code Playgroud)
我可以"修复"这个问题,在重新安装时重新安装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))
Run Code Online (Sandbox Code Playgroud)
听起来您在setuphandlers.py文件中有自定义Python代码来安装依赖项.您是否有理由不注意metadata.xml文件中的依赖项?或者你能告诉我们那些代码吗?
在Plone中激活加载项时,它会对各种实体进行比较之前/之后以支持停用.其中包括本地持久性实用程序,由componentregistry.xml文件定义.注意:GenericSetup xml文件中定义的任何内容都会导致持久更改 - 如果您需要非持久性实用程序,请使用ZCML文件注册它们.
因此,当您有自定义代码在setuphandlers.py代码中添加本地实用程序时,Plone认为此实用程序属于您的主要附加组件.如果您重新安装该附加组件,该实用程序将与其他任何内容一起删除,然后再次安装所有内容.
我猜你的"已安装"检查失败后重新安装并且不再添加该实用程序.
您可以通过简单地为依赖项和主加载项提供自己的GenericSetup配置文件,而不是在main的metadata.xml中注意依赖项来避免所有这些,例如:
<?xml version="1.0"?>
<metadata>
<version>1</version>
<dependencies>
<dependency>profile-my.dependency:default</dependency>
</dependencies>
</metadata>
Run Code Online (Sandbox Code Playgroud)
一旦你这样做,依赖项配置文件将被独立激活,Plone自己跟踪它.如果您随后决定重新安装主加载项,则根本不会触及依赖项并保持不变.
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |