1

ここに問題があります。私はmynamespace.mypackageそれを依存関係として持っていますmynamespace.mydependencypackage、それはローカルユーティリティです。コンポーネントレジストリを使用して登録されます。

config.pyからmynamespace.mypackage、私は持っています

DEPENDENCIES = ['mynamespace.mydependencypackage']

そして、私mynamespace.mypackagesetuphandlers.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

依存関係をインストールするためのカスタムPythonコードがsetuphandlers.pyファイルにあるようです。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 に答える