4

我和我的同事正在尝试调整我们为 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; }

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

如您所见,此附加组件尝试注册一个简单的 Bundle,其中包含仅由一个LESS文件组成的单个资源。(LESS文件非常简单:它只是将控制面板 Resource Registries 图标的颜色更改为红色,因此通过调用@@overview-controlpanel视图应该很容易查看样式是否生效)。按照http://docs.plone.org/adapt-and-extend/theming/resourceregistry.html的指示,我们尝试在“登录”捆绑包聚合中注册我们的捆绑包,以尽量减少发送的文件数量给客户。

在“开发模式”下一切正常。一旦我们点击构建我们的包,包就成功编译了(我们确认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都设置为logged-in并带有一些为合并到文件中的csscompilation属性设置的值(请参阅Products.CMFPlone.resources.browser.combine.write_css)。然而,即使我们的 bundle 有正确的merge_with属性,css编译一个是None,这就解释了为什么没有发生合并。

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

  • 当我们单击 bundles 的 Build 按钮时,构建发生并且plone.bundles/my-package.csscompilation的值设置正确。然而它没有用,因为生产文件没有被重写。如文档中所述,如果资源注册表中有用于生产的合并捆绑包按钮,则问题将得到解决,但是我们只是找不到此按钮(我们在这里遗漏了什么吗?)。我们甚至测试了一个自定义 BrowserView 来模拟这样一个按钮的操作,并确认它可以工作。
  • 如果我们尝试在生产模式下构建我们的包,然后切换到开发模式并返回生产模式以重写登录的.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 值存储在其表单属性中。

我们首先在原版 Plone 5.0.6 中测试了我们的插件,然后在原版 Plone 5.1a2 中进行了测试。两者都表现出相同的行为。

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

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

4

1 回答 1

2

您的插件必须提供您的捆绑 CSS 的编译版本(因为将安装您的插件的人必须能够在 prod 模式下直接使用它,而无需进入资源注册表并自行编译)。

所以编译你的css(你可以复制你通过资源注册表编译它时得到的那个),把它放在/static中,然后添加到你的包中:

<value key="csscompilation">++plone++static/my-package-compiled.css</value>

于 2016-10-11T06:23:15.967 回答