迁移 – Plone 5资源注册表将生成的编译包合并

我和我的同事正在努力调整我们为Plone 4.1开发的一些附加组件,以便在今年晚些时候将Plone环境迁移到Plone 5.这样做,我们在尝试使我们的代码适应新的Resources Registry策略时遇到了一些麻烦.在调查了一段时间后发生的事情后,我们决定在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; }

在我看来,其他文件的内容对此事无益(如果我错了请纠正我).

如您所见,此加载项尝试注册一个简单的Bundle,其中包含仅由一个LESS文件组成的单个Resource. (LESS文件非常简单:它只将控制面板资源注册表的图标颜色更改为红色,因此通过调用@@ overview-controlpanel视图来查看样式是否有效非常容易.
遵循http://docs.plone.org/adapt-and-extend/theming/resourceregistry.html的指令,我们尝试在“登录”捆绑聚合中注册我们的捆绑包,以最小化发送到客户端的文件数量.

“开发模式”中的一切都运行良好.一旦我们单击构建我们的bundle,就会成功编译bundle(我们确认plone.bundles / my-package.csscompilation注册表项的值已从None更改为plone static / my-package-compiled.css).

但是,一旦我们切换到生产模式,我们注意到我们的捆绑包没有合并到logged-in.css文件中,并且@@ overview-controlpanel中的图标将不再将其颜色更改为红色.
我们已经深入研究了Products.CMFPlone中的代码,试图找出发生了什么,并发现在生产模式下编写logged-in.css文件时,所有带有merge_with属性的bundle都设置为登录并且有一些为合并到文件中的csscompilation属性设置的值(请参阅Products.CMFPlone.resources.browser.combine.write_css).
但是,即使我们的bundle具有正确的merge_with属性,csscompilation也是None,这解释了为什么没有发生合并.

我们尝试了一些替代方案,但没有一个有效:

>当我们单击我们的bundle的Build按钮时,将进行构建并正确设置plone.bundles / my-package.csscompilation的值.但是它无济于事,因为生产文件不会被重写.如果文档中提到的资源注册表中有一个Merge bundle for production按钮,问题就会解决,但是我们找不到这个按钮(我们在这里缺少什么?).我们甚至测试了一个自定义BrowserView,它模拟了这样一个按钮的动作,并确认它可以工作.
>如果我们尝试在生产模式下构建bundle然后切换到开发模式并返回生产模式以重写logged-in.css文件,我们注意到plone.bundles / my-package.csscompilation的值是回到无.
再次在Products.CMFPlone的源代码中搜索,我们发现这个值被方法Products.CMFPlone.controlpanel.browser.resourceregistry.ResourceRegistryControlPanelView#save_registry改变了,在行中

self.update_registry_collection(
    IBundleRegistry, "plone.bundles",
    json.loads(req.get('bundles')))

由于某些未知原因,似乎请求将None值存储在其form属性中.

我们首先在香草Plone 5.0.6中测试了我们的附加组件,然后在香草Plone 5.1a2中测试了我们的附加组件.两者都表现出相同的行为.

在总结之前,让我首先强调,这只是一个简单的例子,试图调查我们在程序中是否做错了.
我们知道在这个特定的场景中,使用CSS文件而不是LESS并使用我们的Generic Setup配置文件中的csscompilation属性要容易得多.
但是,我们希望为一个场景做好准备,我们将拥有各种LESS文件,这些文件实际上使用了bundle中的plone LESS变量,并且我们可以在生产中将其合并到logged-in.css文件(或默认值).这个问题的css文件).

无论如何,我们想知道我们的程序是否有任何错误,或者这是否是Products.CMFPlone中的错误,我们应该打开报告它的票证.任何意见或建议将不胜感激!

最佳答案 您的加载项必须提供捆绑CSS的编译版本(因为将安装您的加载项的人必须能够直接在prod模式下使用它而无需访问Resource注册表并自行编译).

所以编译你的css(你可以复制你通过Resource registry编译它时得到的那个),把它放在/ static中,并添加到你的bundle:

< value key =“csscompilation”> plone static / my-package-compiled.css< / value>

点赞