产品依赖性:触发安装

时间:2011-05-25 11:46:15

标签: plone dependency-management

我正在为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。)

3 个答案:

答案 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注册表:

https://github.com/collective/collective.jqueryuithememanager/blob/master/collective/jqueryuithememanager/registry.py