我正在为Plone开发一个产品,比如foo.core
。除了核心产品外,还有几个相关产品。比如foo.optional
。这些相关产品可能在实例中可用,如果它们可用,则可以安装(换句话说:我不能假设代码可用,或者如果是,则应该使用)。
这些相关产品可能会覆盖foo.core
所做的设置(例如,在属性表中)。这样可以正常工作,但如果我重新安装foo.core
,则会返回默认设置。我想要的是在QuickInstaller中重新安装foo.optional
时以某种方式自动重新安装foo.core
。
我能提出的解决方案是:
foo.optional
时,它
用foo.core
注册自己。该
后者,foo.core
,将处理
重新安装所有注册的
核心包装时的产品
重新安装。 foo.core
包
触发其他事件
像foo.optional
这样的包可以
听。一个事件处理程序将
然后触发重新安装
foo.optional
。 foo.core
不会覆盖任何设置
可能是后来定制的
其他产品。也许有更多选择?什么是“Plonish”方法?
编辑:我知道使用升级步骤可能比重新安装产品更好。但是,恕我直言,问题仍然存在:用于升级步骤的通用设置配置文件可能具有在foo.optional
包的通用设置配置文件中修改的设置。
因此,使用升级步骤会让我的问题变得更加困难:我应该如何确定foo.core
的升级步骤是否应该重新安装/升级foo.optional
? (原则上假设foo.core
原则上不了解foo.optional
。)
答案 0 :(得分:5)
您的问题的解决方案比您的建议容易得多:
我们不会像过去那样在产品更新时重新安装产品。重新安装产品将导致重新应用您的通用设置配置文件,这就是您覆盖设置的原因。
相反,您现在提供升级步骤。例如,如果您将个人资料版本从2更改为3,那么您将拥有:
<genericsetup:upgradeStep
title="Upgrade foo.core from revision 2 to 3"
description="Adds stuff"
source="2"
destination="3"
handler="foo.core.upgrades.two_to_three.addStuff"
sortkey="1"
profile="foo.core:default"
/>
在升级步骤中,您可以执行您喜欢的操作,甚至可以重新运行单个导入步骤。
如果您的产品升级不涉及更改GS配置文件,请不要在metadata.xml中增加版本。在这种情况下,您显然也不需要升级步骤。
答案 1 :(得分:1)
我怀疑你是通过涉及Plone的附加安装故事(由于“旧”和“新”技术并存)而使自己变得更加困难。我会后退一步,更多地考虑你试图设计/实现的插件系统,并避免包括Plone直到你必须[1]。
您还可以考虑使用入口点来实现至少一部分插件系统:
[1]假设Plone是一个严格的要求,并且你正在构建一个内容管理驱动的应用程序,否则你可能应该使用Django或Pyramid
答案 2 :(得分:1)
安装/重新安装不会在加载项的上下文中产生感觉。词汇已被更改为激活/取消激活,但它不足以理解情况。
您有一个“设置”,您可以在其中应用配置文件。一次又一次地应用配置文件除了破坏现有配置之外不会做任何事情。
这就是每个机构都会通过升级步骤回复此问题的原因。我们不会在重新安装时触发配置文件,我们会在安装配置文件发生一些更改时升级附加组件。
因此,如果您在foo.optional中更改了foo.core添加的设置,则可以执行以下操作。
使用新的plone.registry,您可以为IRecord相关事件添加处理程序:
考虑文档:
http://pypi.python.org/pypi/plone.registry
我做了一些与此相关的代码,我想在更改某些设置时重建css注册表: