我的产品中有config.py
,有:
DEPENDENCIES = ['bbbbbbbbbbbb'] #This doesn't exist
在我的setuphandlers.py
:
for dependency in DEPENDENCIES:
if not quickinstaller.isProductInstalled(dependency):
quickinstaller.installProduct(dependency)
现在我在portal_quickinstaller的Contents选项卡中有一个 bbbbbbbbbbbb 条目。 (HTTP://本地主机:8080 / Plone的/ portal_quickinstaller / manage_main)。
如果依赖项不存在,我该怎么做才能使依赖项部分“抱怨”(引发异常,无论如何)?谢谢!
编辑:我发现使用quickinstaller.getProductVersion
的黑客攻击:如果什么也没有,它就不存在了。还有另一种方式吗?
答案 0 :(得分:2)
您可以使用以下内容:
def install_dependencies(site):
"""Install required products"""
qi = getToolByName(site, 'portal_quickinstaller')
for product in DEPENDENCIES:
if not qi.isProductInstalled(product):
if qi.isProductInstallable(product):
qi.installProduct(product)
else:
raise "Product %s not installable" % product
答案 1 :(得分:1)
声明deps的正常方法是使用metadata.xml
:
<metadata>
<dependencies>
<dependency>profile-plone.app.iterate:plone.app.iterate</dependency>
</dependencies>
</metadata>
这将添加plone.app.iterate
包,因为其安装配置文件名称为plone.app.iterate
。其中绝大多数称为默认值,例如:
<metadata>
<dependencies>
<dependency>profile-plone.app.jquerytools:default</dependency>
<dependency>profile-archetypes.referencebrowserwidget:default</dependency>
<dependency>profile-plone.app.imaging:default</dependency>
<dependency>profile-plone.app.registry:default</dependency>
<dependency>profile-plone.portlet.collection:default</dependency>
</dependencies>
</metadata>
当然,这仅适用于您尝试安装的产品具有通用设置配置文件,但除了最老的产品之外都有效。
答案 2 :(得分:0)
我想这取决于你可能有一个不存在的产品。
通常,你不会在这里测试它 - 你将你的依赖项放在setup.py中,然后如果产品不存在你的buildout就会失败。
但是,如果你有一个可能使用第二个产品的产品(例如,SQLAlchemy需要一个或多个python DBAPI鸡蛋,但没有特定的产品),那么我认为你需要做通常的事情:这是使用 try / except 包装产品中某个模块的导入,如果导入失败则不进行安装。