关于 enonic-content-management
这是一项面向 Enonic XP 项目的批量内容操作与迁移技能。它帮助开发者选择合适的 API、分批处理内容、管理分支和发布,并汇报进度。
主要功能
- 01识别 Enonic XP 项目和版本
- 02选择内容或节点 API
- 03使用 NoQL 查询内容
- 04分批处理批量操作
- 05管理 draft 与 master 发布
- 06跟踪长时间任务进度
适用场景
- 01从 JSON 或 CSV 导入内容
- 02按查询条件更新或删除内容
- 03在路径或环境之间迁移内容
- 04为大型操作提供进度报告
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ webmaxru/ enonic-agent-skills --skill enonic-content-management安装后在 Claude Code 中输入/enonic-content-management确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/bulk-update.template.tstask-migration.template.tsreferences/compatibility.mdexamples.mdmigration-reference.mdtroubleshooting.mdscripts/find-enonic-targets.mjs详细介绍
Enonic 内容管理
操作步骤
步骤 1:识别 Enonic XP 项目和操作范围
- 检查工作区中的 Enonic XP 项目标记:包含
com.enonic.xp依赖项的build.gradle、src/main/resources/目录结构,或包含xpVersion的gradle.properties。 - 如果有可用的 Node 运行时,执行
node scripts/find-enonic-targets.mjs .,扫描 Enonic XP 项目标记和现有内容操作文件。 - 如果未检测到 Enonic XP 项目,请停止并说明此技能仅适用于 Enonic XP 内容操作。
- 从
gradle.properties或build.gradle确定目标 XP 版本,以选择正确的 API。 - 对请求的操作进行分类:
- 批量创建:从外部来源(JSON、CSV、API)导入内容。
- 批量更新:修改符合查询条件的现有内容。
- 批量删除:删除符合查询条件的内容。
- 迁移:在路径、站点或环境之间移动或转换内容。
- 查询/聚合:使用 NoQL 和聚合检索并分析内容。
- 长时间运行的任务:处理超过约 100 个项目且需要进度报告的任何操作。
步骤 2:选择 API 层和上下文
- 阅读
references/migration-reference.md,了解查询 DSL 模式、批处理策略和分支处理规则。 - 如果操作涉及 CMS 内容,且需要发布/取消发布、内容类型验证以及内容域抽象,请选择
lib-content。 - 如果操作需要低级节点操作、自定义存储库,或需要绕过内容类型验证来迁移原始数据,请选择
lib-node。 - 确定所需的上下文:
- 使用
lib-context在draft分支中执行修改操作,并在master分支中读取已发布的内容。 - 如果操作需要提升权限,请将
lib-context与role:system.admin主体配合使用。
- 使用
- 如果操作处理超过约 100 个项目,请使用
lib-task将其封装在任务控制器中。阅读references/migration-reference.md中有关任务控制器的章节,了解相应模式。
步骤 3:构建查询
- 构建 NoQL 查询字符串或 DSL 表达式,以匹配目标内容。
- 对于内容类型筛选,请在
contentLib.query()中使用contentTypes参数,或在节点查询中比较type属性。 - 对于日期范围查询,请使用
instant()或dateTime()函数以及range()查询函数。 - 对于全文搜索,请使用
fulltext(),并指定适当的字段路径和运算符(AND/OR)。 - 对于限定路径范围的操作,请使用
_path LIKE '/content/site-path/*'匹配后代项。注意:NoQL 查询中的_path属性包含内部/content/前缀,但结果中的hit._path返回的是不带此前缀的内容域路径。根据结果路径构建查询时,务必添加/content/前缀。 - 添加
filters,通过exists、notExists、hasValue或boolean组合高效缩小查询结果范围。 - 如果操作需要分组统计数据(术语计数、日期直方图、数值范围、统计信息),请添加
aggregations。 - 阅读
references/examples.md,了解完整的查询和聚合模式。 第 4 步:实现批处理 - 使用带
start和count参数的分页检索,避免将所有结果加载到内存中。 - 根据每个项目的处理复杂度,将
count设为 50 到 200 之间的批量大小。 - 循环执行,直到
result.hits.length === 0或start >= result.total;每次迭代将start增加一个批量大小。 - 批量使用
contentLib.create()时,设置refresh: false,避免逐项刷新索引;批处理完成后手动刷新。 - 对于
contentLib.modify(),使用编辑器回调模式,以安全地转换每个内容项。 - 对于
contentLib.publish(),将键分成每组 50–100 个的批次,避免大量发布时超时。 - 跟踪成功和失败数量,以便生成报告。
- 阅读
assets/bulk-update.template.ts,了解可复用的批量更新控制器模板。注意:模板使用 TypeScript/ESM 语法(import、const、箭头函数);部署为 XP 运行时.js文件时,需改用 CommonJS JavaScript 语法(require()、var、function())。
第 5 步:处理分支操作和发布
- 在
draft分支上下文中执行内容修改。 - 修改完成后,使用
contentLib.publish()将已更改项目发布到master。在 XP < 7.12 时,传入sourceBranch: 'draft'和targetBranch: 'master'。在 XP 7.12+ 时,这些参数会被忽略(发布始终从 draft 到 master)。 - 发布批量更新的项目时,设置
includeDependencies: false,以避免意外发布依赖项。 - 对比 draft 和 master 状态的操作,使用
lib-node中的repo.diff(),并设置target: 'master'和includeChildren: true。
第 6 步:使用任务控制器包装长时间运行的操作
- 内联任务函数使用
taskLib.executeFunction(),命名任务描述符使用taskLib.submitTask()。 - 批处理期间定期使用
taskLib.progress({ info, current, total })报告进度。 - 阅读
assets/task-migration.template.ts,了解带进度报告的可复用任务控制器模板。 - 启动重复操作前,使用
taskLib.isRunning()检查是否已有运行中的实例。 - 如果操作产生过高负载,使用
taskLib.sleep()在批次之间进行限流。 - 对于 XP 7.13+ 上的命名任务,
run函数的第二个参数为taskId:exports.run = function(params, taskId) { ... }。
第 7 步:验证并报告结果
- 操作完成后,记录摘要:已处理的项目数、已创建/更新/删除的项目数、失败的项目数、总耗时。
- 对于迁移操作,通过查询目标路径验证目标内容是否存在。
- 对于发布操作,通过查询
master分支验证发布状态。 - 如果发生错误,将错误详情(内容路径、错误消息)整理成结构化报告。
错误处理
- 如果
scripts/find-enonic-targets.mjs未找到 Enonic XP 项目,请说明工作区不包含 Enonic XP 应用。 - 如果内容操作因
contentAlreadyExists失败,请检查目标是否存在,并决定更新还是跳过。阅读references/troubleshooting.md,了解重复项处理模式。 - 如果查询返回零条结果,请检查查询语法、分支上下文和属性路径。NoQL 字符串格式不匹配(例如日期比较缺少
instant()包装)是常见原因。 - 如果任务失败或超时,请检查
taskLib.get(taskId)中的状态和进度详情。阅读references/troubleshooting.md,了解超时和权限问题。 - 如果发布或修改时发生
AccessDeniedException,请确保上下文通过lib-context包含role:system.admin主体。
评论
支持 Markdown