Plone 5资源注册表合并生产中的编译包

时间:2016-10-10 18:06:25

标签: migration plone plone-5.x

我和我的同事正在努力调整我们为Plone 4.1开发的一些附加组件,以便在今年晚些时候将Plone环境迁移到Plone 5。这样做,我们在尝试使我们的代码适应新的Resources Registry策略时遇到了一些麻烦。在调查了一段时间后发生的事情后,我们决定在一个普通的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 文件非常简单:它只将控制面板资源注册表图标的颜色更改为红色,因此通过调用它应该很容易看出样式是否生效 @@ overview-controlpanel 视图)。 遵循http://docs.plone.org/adapt-and-extend/theming/resourceregistry.html的指示,我们尝试在登录的&#39;中注册我们的捆绑包。捆绑聚合,以最小化发送到客户端的文件数。

在#34;开发模式&#34;中一切正常。一旦我们点击构建我们的包,就成功编译了包(我们确认 plone.bundles / my-package.csscompilation 注册表项的值已从None更改为 ++ plone ++静态/我的封装-compiled.css )。

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

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

  • 当我们点击我们的捆绑包的构建按钮时,会进行构建并正确设置 plone.bundles / my-package.csscompilation 的值。但是它无济于事,因为生产文件不会被重写。如果文档中提到的资源注册表中有 Merge捆绑生产按钮,问题就会解决,但是我们无法找到这个按钮(我们在这里遗漏了什么? )。我们甚至测试了一个自定义BrowserView,它模拟了这样一个按钮的动作,并确认它可以正常工作。
  • 如果我们尝试在生产模式下构建捆绑包然后切换到开发模式并返回生产模式以重写logged-in.css文件,我们注意到 plone的值。 bundles / my-package.csscompilation 设置回None。 再次在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 并使用我们的 csscompilation 属性要容易得多。通用设置配置文件。 但是,我们希望为一个场景做好准备,我们将拥有各种 LESS 文件,这些文件实际上使用了bundle中的plone LESS 变量,并且我们可以合并生成 logged-in.css 文件(或 default.css 文件)。

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

1 个答案:

答案 0 :(得分:2)

您的附加组件必须提供捆绑CSS的编译版本(因为安装附加组件的人必须能够直接在prod模式下使用它而无需访问Resource注册表并自行编译)。

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

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