【问题标题】:How to exclude sub-nodes in an AEM package using filters如何使用过滤器排除 AEM 包中的子节点
【发布时间】:2014-08-12 14:05:59
【问题描述】:

我正在创建一个 AEM 内容包,生成的 zip 包含必要的 META-INF 目录和 filter.xml。

包的内容是这样组织的:

/jcr_root/apps/appgroup/myapp/components
/jcr_root/apps/appgroup/myapp/i18n/en_us.xml
/jcr_root/apps/appgroup/myapp/i18n/es_mx.xml
/jcr_root/apps/appgroup/myapp/templates

filter.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<workspaceFilter version="1.0">
    <filter root="/apps/appgroup/myapp">
        <exclude pattern="/apps/appgroup/myapp/i18n(/.*)?" />
    </filter>
</workspaceFilter>

尽管有排除模式,安装包时 i18n 节点仍会部署到 CRX 中。过滤器不应该排除 i18n 节点吗?

最终,我只想部署 en_us 节点并让过滤器阻止任何其他语言。

我的理解是在安装期间而不是在编译期间考虑过滤器。这是正确的吗?

【问题讨论】:

    标签: aem


    【解决方案1】:

    在构建包而不是安装包时应用过滤器。有了排除项,它不应该被你的包安装,但这也意味着如果它已经存在,它也不会被删除!它应该表现得好像包没有接触到排除过滤器所覆盖的区域。

    来自文档*

    • 要包括我的应用程序的所有脚本,但表单组件:
      • 根路径: /apps/myapp
      • 规则: 排除:/apps/myapp/components/form(/.*)?

    表单组件不包含在包中。如果这样的组件 安装包时已经存在,CRX不会删除它, 因为它不是由过滤器定义的。

    在构建包时,每个过滤器定义的所有内容都包括在内。提取包时,所有与过滤器匹配的现有内容都将被删除或替换。


    编辑:在 Maven 包中工作,您可以使用 resource 声明指定排除的元素,以避免将内容添加到 Zip 例如:

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>jcr_root/apps/appgroup/myapp/i18n</exclude>
                    <exclude>jcr_root/apps/appgroup/myapp/i18n/**/*.*</exclude>
                </excludes> 
            </resource>
        </resources>
    </build>
    

    filter.xml 有可能在构建时被 Maven 忽略,一旦内容在包中,CQ 无论如何都会安装它。


    EDIT2: * 由于 Day.com 已关闭,初始示例不再文档中,但仍应适用。更新的文档是now available here

    【讨论】:

    • 我没有通过 AEM 生成 zip。我正在使用 Maven。 zip 中包含 i18n 节点和子节点,filter.xml 将它们排除在外。 CRX 中不存在 i18n 节点。安装时,AEM 不考虑创建 i18n 节点的过滤器。您是说如果 i18n 节点已经存在,过滤器会阻止覆盖,但由于节点不存在,AEM 会创建它?
    • 你可能需要在构建你的包时排除它们——Maven会忽略你的filter.xml,因为它对它没有任何意义;如果内容在包中但不在过滤器中,我不确定 CQ 会做什么 - 根据您的经验,听起来它无论如何都会安装它!
    • 是的,我误解了 AEM 如何解释安装时的排除过滤器。如果节点在包 zip 中但不在 CRX 中,则 AEM 会创建它。但是,如果排除的节点已经在 CRX 中,则 AEM 不会覆盖它。我猜这是基于默认过滤器modemerge,我想但是这个博客说replace(见wemblog.com/2012/04/how-to-change-package-install-behavior.html)无论如何,谢谢你指出我正确的方向。
    • 经过更多测试,默认过滤模式似乎确实是replace。 (&lt;filter root="/apps/myapp" mode="replace" /&gt;)
    • @anotherdave 如果我提到根路径 /apps/myapp 并排除 /apps/myapp/components/form(/.*)?那么它不排除。你确定它工作正常吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2018-07-26
    相关资源
    最近更新 更多