Plone 5 资源注册表在生产中合并编译包
Plone 5 resource registries merge compiled bundle in production
我和我的同事正在尝试调整我们为 Plone 4.1 开发的一些附加组件,以便在今年晚些时候将我们的 Plone 环境迁移到 Plone 5。这样做时,我们在尝试使我们的代码适应新的资源注册表政策时遇到了一些麻烦。在调查了一段时间后,我们决定在 vanilla Plone 环境中用最少的代码测试一个插件,看看我们是否做错了什么。
本插件文件结构如下:
- my.package
- my
- package
- profiles
- default
- metadata.xml
- registry.xml
- uninstall
- registry.xml
- static
- css
- style.less
- __init__.py
- configure.zcml
- __init__.py
- my.package.egg-info
- setup.cfg
- setup.py
my.package.configure.zcml内容如下:
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:five="http://namespaces.zope.org/five"
xmlns:plone="http://namespaces.plone.org/plone"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup">
<five:registerPackage package="." initialize=".initialize" />
<plone:static
directory="static"
type="plone"
name="my.package" />
<genericsetup:registerProfile
name="default"
title="my.package"
directory="profiles/default"
description="Installs my.package"
provides="Products.GenericSetup.interfaces.EXTENSION" />
<genericsetup:registerProfile
name="uninstall"
title="my.package"
directory="profiles/uninstall"
description="Uninstalls my.package"
provides="Products.GenericSetup.interfaces.EXTENSION" />
</configure>
my.package.profiles.registry.xml内容如下:
<registry>
<records prefix="plone.resources/my-package"
interface='Products.CMFPlone.interfaces.IResourceRegistry'>
<value key="css">
<element>++plone++my.package/css/style.less</element>
</value>
</records>
<records prefix="plone.bundles/my-package"
interface='Products.CMFPlone.interfaces.IBundleRegistry'>
<value key="resources">
<element>my-package</element>
</value>
<value key="enabled">True</value>
<value key="compile">True</value>
<value key="merge_with">logged-in</value>
</records>
</registry>
my.package.static.css.style.less内容如下:
.icon-controlpanel-resourceregistries:before { color: red; }
在我看来,其他文件的内容与此事无关(如果我错了,请纠正我)。
如您所见,此加载项尝试注册一个简单的捆绑包,其中包含仅由一个 LESS 文件组成的单个资源。 (LESS 文件非常简单:它只是将控制面板 Resource Registries 的图标颜色更改为红色,因此通过调用@@overview-controlpanel 视图)。
按照 http://docs.plone.org/adapt-and-extend/theming/resourceregistry.html 的指示,我们尝试在 'logged-in' 包聚合中注册我们的包,以尽量减少发送给客户端的文件数量。
"Development Mode" 一切正常。一旦我们点击构建我们的包,包就成功编译了(我们确认 plone.bundles/my-package.csscompilation 注册表项的值已从None 到 ++plone++static/my-package-compiled.css).
然而,一旦我们切换到生产模式,我们注意到我们的包没有被合并到 logged-in.css 文件和 @@overview-controlpanel 的颜色将不再变为红色。
我们深入研究了 Products.CMFPlone 中的代码,试图找出发生了什么,发现在生产模式下写入 logged-in.css 文件时, merge_with 属性设置为 logged-in 且某些值设置为 [=127 的所有捆绑包=]compilation 属性合并到文件中(参见 Products.CMFPlone.resources.browser.combine.write_css)。
然而,即使我们的包具有正确的 merge_with 属性,csscompilation 一个是 None ,这解释了为什么合并没有发生。
我们尝试了一些备选方案,但 none 个可行:
- 当我们点击 bundle 的构建按钮时,构建发生并且 plone.bundles/my-package.csscompilation 的值被正确设置。然而这是无济于事的,因为生产文件没有被重写。如果资源注册表中有一个 Merge bundles for production 按钮,问题就会得到解决,如文档中所述,但是我们就是找不到这个按钮(我们在这里遗漏了什么吗?)。我们甚至测试了模拟此类按钮操作的自定义 BrowserView,并确认它可以正常工作。
如果我们尝试在生产模式下构建我们的包,然后切换到开发模式并返回生产模式以重写记录的-in.css 文件,我们注意到值plone.bundles/my-package.csscompilation 设置回 None。
再次在Products.CMFPlone的源码中查找,发现这个值被Products.CMFPlone.controlpanel.browser.resourceregistry.ResourceRegistryControlPanelView#save_registry[=75这个方法改变了=],在行
self.update_registry_collection(
IBundleRegistry, "plone.bundles",
json.loads(req.get('bundles')))
由于某些未知原因,请求似乎将 None 值存储在其 form 属性中。
我们首先在 vanilla Plone 5.0.6 中测试了我们的附加组件,然后在 vanilla Plone 5.1a2 中进行了测试。两者表现出相同的行为。
在总结之前,让我首先强调一下,这只是一个简单的例子,试图调查我们的程序是否做错了什么。
我们知道,在这种特定情况下,只使用 CSS 文件而不是 LESS 并使用 csscompilation 属性在我们的通用设置配置文件中。
但是,我们想为这样一种情况做好准备,在这种情况下,我们会有各种 LESS 文件,这些文件实际上在一个包中使用了 plone LESS 变量并且我们可以在生产中合并到 logged-in.css 文件(或 default.css 文件) .
无论如何,我们想知道我们是否在我们的程序中做错了什么,或者这是 Products.CMFPlone 中的一个错误,我们应该打开一个工单报告它。如有任何意见或建议,我们将不胜感激!
您的附加组件必须提供您的包的编译版本 CSS(因为将安装您的附加组件的人必须能够直接在生产模式下使用它,而无需转到资源注册表并编译它自己)。
所以编译你的css(你可以通过资源注册表复制你编译时得到的那个),把它放在/static,然后添加到你的包中:
<value key="csscompilation">++plone++static/my-package-compiled.css</value>
我和我的同事正在尝试调整我们为 Plone 4.1 开发的一些附加组件,以便在今年晚些时候将我们的 Plone 环境迁移到 Plone 5。这样做时,我们在尝试使我们的代码适应新的资源注册表政策时遇到了一些麻烦。在调查了一段时间后,我们决定在 vanilla Plone 环境中用最少的代码测试一个插件,看看我们是否做错了什么。
本插件文件结构如下:
- my.package
- my
- package
- profiles
- default
- metadata.xml
- registry.xml
- uninstall
- registry.xml
- static
- css
- style.less
- __init__.py
- configure.zcml
- __init__.py
- my.package.egg-info
- setup.cfg
- setup.py
my.package.configure.zcml内容如下:
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:five="http://namespaces.zope.org/five"
xmlns:plone="http://namespaces.plone.org/plone"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup">
<five:registerPackage package="." initialize=".initialize" />
<plone:static
directory="static"
type="plone"
name="my.package" />
<genericsetup:registerProfile
name="default"
title="my.package"
directory="profiles/default"
description="Installs my.package"
provides="Products.GenericSetup.interfaces.EXTENSION" />
<genericsetup:registerProfile
name="uninstall"
title="my.package"
directory="profiles/uninstall"
description="Uninstalls my.package"
provides="Products.GenericSetup.interfaces.EXTENSION" />
</configure>
my.package.profiles.registry.xml内容如下:
<registry>
<records prefix="plone.resources/my-package"
interface='Products.CMFPlone.interfaces.IResourceRegistry'>
<value key="css">
<element>++plone++my.package/css/style.less</element>
</value>
</records>
<records prefix="plone.bundles/my-package"
interface='Products.CMFPlone.interfaces.IBundleRegistry'>
<value key="resources">
<element>my-package</element>
</value>
<value key="enabled">True</value>
<value key="compile">True</value>
<value key="merge_with">logged-in</value>
</records>
</registry>
my.package.static.css.style.less内容如下:
.icon-controlpanel-resourceregistries:before { color: red; }
在我看来,其他文件的内容与此事无关(如果我错了,请纠正我)。
如您所见,此加载项尝试注册一个简单的捆绑包,其中包含仅由一个 LESS 文件组成的单个资源。 (LESS 文件非常简单:它只是将控制面板 Resource Registries 的图标颜色更改为红色,因此通过调用@@overview-controlpanel 视图)。 按照 http://docs.plone.org/adapt-and-extend/theming/resourceregistry.html 的指示,我们尝试在 'logged-in' 包聚合中注册我们的包,以尽量减少发送给客户端的文件数量。
"Development Mode" 一切正常。一旦我们点击构建我们的包,包就成功编译了(我们确认 plone.bundles/my-package.csscompilation 注册表项的值已从None 到 ++plone++static/my-package-compiled.css).
然而,一旦我们切换到生产模式,我们注意到我们的包没有被合并到 logged-in.css 文件和 @@overview-controlpanel 的颜色将不再变为红色。 我们深入研究了 Products.CMFPlone 中的代码,试图找出发生了什么,发现在生产模式下写入 logged-in.css 文件时, merge_with 属性设置为 logged-in 且某些值设置为 [=127 的所有捆绑包=]compilation 属性合并到文件中(参见 Products.CMFPlone.resources.browser.combine.write_css)。 然而,即使我们的包具有正确的 merge_with 属性,csscompilation 一个是 None ,这解释了为什么合并没有发生。
我们尝试了一些备选方案,但 none 个可行:
- 当我们点击 bundle 的构建按钮时,构建发生并且 plone.bundles/my-package.csscompilation 的值被正确设置。然而这是无济于事的,因为生产文件没有被重写。如果资源注册表中有一个 Merge bundles for production 按钮,问题就会得到解决,如文档中所述,但是我们就是找不到这个按钮(我们在这里遗漏了什么吗?)。我们甚至测试了模拟此类按钮操作的自定义 BrowserView,并确认它可以正常工作。
如果我们尝试在生产模式下构建我们的包,然后切换到开发模式并返回生产模式以重写记录的-in.css 文件,我们注意到值plone.bundles/my-package.csscompilation 设置回 None。 再次在Products.CMFPlone的源码中查找,发现这个值被Products.CMFPlone.controlpanel.browser.resourceregistry.ResourceRegistryControlPanelView#save_registry[=75这个方法改变了=],在行
self.update_registry_collection( IBundleRegistry, "plone.bundles", json.loads(req.get('bundles')))
由于某些未知原因,请求似乎将 None 值存储在其 form 属性中。
我们首先在 vanilla Plone 5.0.6 中测试了我们的附加组件,然后在 vanilla Plone 5.1a2 中进行了测试。两者表现出相同的行为。
在总结之前,让我首先强调一下,这只是一个简单的例子,试图调查我们的程序是否做错了什么。 我们知道,在这种特定情况下,只使用 CSS 文件而不是 LESS 并使用 csscompilation 属性在我们的通用设置配置文件中。 但是,我们想为这样一种情况做好准备,在这种情况下,我们会有各种 LESS 文件,这些文件实际上在一个包中使用了 plone LESS 变量并且我们可以在生产中合并到 logged-in.css 文件(或 default.css 文件) .
无论如何,我们想知道我们是否在我们的程序中做错了什么,或者这是 Products.CMFPlone 中的一个错误,我们应该打开一个工单报告它。如有任何意见或建议,我们将不胜感激!
您的附加组件必须提供您的包的编译版本 CSS(因为将安装您的附加组件的人必须能够直接在生产模式下使用它,而无需转到资源注册表并编译它自己)。
所以编译你的css(你可以通过资源注册表复制你编译时得到的那个),把它放在/static,然后添加到你的包中:
<value key="csscompilation">++plone++static/my-package-compiled.css</value>