关于 experience-ui-bundle-custom-app-generate
该 Skill 为 Salesforce React UI Bundle 生成 Lightning Experience 自定义应用元数据,面向需要向内部用户提供应用入口的开发者。它根据目标组织的 API 版本确定 Bundle 引用字段,并修改现有 Bundle 元数据以匹配托管目标。
主要功能
- 01生成 CustomApplication 元数据
- 02解析应用名称、命名空间与标签
- 03查询 API 版本支持的字段
- 04更新现有 UI Bundle 元数据
- 05验证部署配置
适用场景
- 01在 Lightning App Launcher 中提供应用入口
- 02将 React UI Bundle 配置为内部应用
- 03适配不同 Salesforce API 版本
- 04验证 CustomApplication 与 UI Bundle 部署
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ forcedotcom/ sf-skills --skill experience-ui-bundle-custom-app-generate安装后在 Claude Code 中输入/experience-ui-bundle-custom-app-generate确认已加载。
附带文件references/configure-metadata-custom-application.mdscripts/resolve-uibundle-path.mjs
详细介绍
React UI Bundle 的自定义应用
创建并配置 Salesforce 自定义应用,以便在 Lightning Experience 中托管 React UI bundle。此技能会生成 CustomApplication 元数据,使应用显示在 Lightning App Launcher 中,并供内部用户访问。
自定义应用与 Experience Sites 不同:它们不需要 Networks、CustomSite、DigitalExperienceConfig 或 DigitalExperienceBundle 元数据。自定义应用充当轻量级的启动器入口,并将渲染工作交给 uiBundle 引用的 React UI bundle。
必需属性
生成任何元数据之前,请先解析所有属性。每项属性都有一条回退链——按顺序尝试各个选项,直到找到值。
| 属性 | 格式 | 解析方式 |
|---|---|---|
| appName | lowercamelcase(例如,myInternalApp) | uiBundles/<name>/ 目录中的 UI bundle 名称 |
| appNamespace | 字符串 | sfdx-project.json 中的 namespace → sf data query -q "SELECT NamespacePrefix FROM Organization" --target-org ${usernameOrAlias} → 默认为 c |
| appLabel | 易于理解的字符串 | 用户提供;或将 appName 中的 camelCase 转换为标题格式 |
appNamespace 和 appName 用于将自定义应用连接到正确的 React UI bundle。在较新的 API 版本中使用 <uiBundle>{appNamespace}__{appName}</uiBundle>;在较旧的版本中使用 <webApplication>{appName}</webApplication>。如果这里设置错误,应用启动器入口仍会存在,但会显示空白页面。工作流的第 2 步会确定要使用哪个字段。
生成工作流
第 1 步:解析所有必需属性
在构建任何内容之前,确定所有属性的值。使用上表中的解析策略。
第 2 步:查询 API 上下文(按版本发现字段)
调用 salesforce-api-context MCP 工具,发现目标组织 API 版本中存在哪些字段。这可确保生成的元数据与用户的 Salesforce 版本兼容。
必需调用——请严格使用下方所示的 metadataType 参数。请勿替换为 detail 参数或任何其他形式;此工具仅接受 metadataType 参数:
get_metadata_type_fields({ "metadataType": "CustomApplication" })— 检查响应的字段列表中是否存在uiBundle字段get_metadata_type_fields({ "metadataType": "UIBundle" })— 检查响应的字段列表中是否存在target字段
根据 API 响应解析字段:
| 字段检查 | 如果存在 | 如果不存在(较旧的 API 版本) |
|---|---|---|
CustomApplication.uiBundle | 使用 <uiBundle>{appNamespace}__{appName}</uiBundle> | 使用 <webApplication>{appName}</webApplication>(不含命名空间) |
UIBundle.target | 使用 <target>CustomApplication</target> | 完全省略 <target> 元素 |
如果实际尝试后 salesforce-api-context 仍不可用,则回退到较新的字段名称(uiBundle + target)。
第 3 步:创建项目结构
创建所有尚不存在的文件和目录:
| 元数据类型 | 路径 |
|---|---|
| CustomApplication | <sourceDir>/applications/{appName}.app-meta.xml |
注意:<sourceDir> 由 sfdx-project.json 确定。读取 packageDirectories[],并使用其中 "default": true 的条目;完整源目录为 <path>/main/default。如果未设置默认项,则使用第一个条目。常见路径为 force-app/main/default,但此路径可配置。
步骤 4:填写所有元数据字段
使用下方文档中的默认模板。{大括号} 中的值是已解析的属性引用——将它们替换为步骤 1 中的实际值。应用步骤 2 中的字段解析结果,以确定要使用哪些 XML 元素。
| 元数据类型 | 模板引用 |
|---|---|
| CustomApplication | configure-metadata-custom-application.md |
步骤 4 的执行说明:加载并使用文档
- Agent 在尝试填写元数据字段前,必须阅读步骤 4 所引用的
references/*.md文件的全部内容。 - 完整读取该文件,替换占位符(例如
{appName})为已解析的值,然后使用展开后的模板填写元数据 XML 内容。 - 如果步骤 2 判定应使用较旧的字段名称,请在生成的输出中将
<uiBundle>替换为<webApplication>。
步骤 5:更新 UI Bundle 元 XML
此步骤编辑的是现有文件——绝不会创建新文件。UIBundle 是一种捆绑包样式的元数据类型:其元 XML 通常位于自己的文件夹中,路径为 uiBundles/{appName}/{appName}.uibundle-meta.xml,与该捆绑包的其他源文件(例如 index.html、src/)并列。一些较旧或手动编写的项目可能使用扁平路径 uiBundles/{appName}.uibundle-meta.xml(没有子文件夹)。
运行 node scripts/resolve-uibundle-path.mjs "{appName}"——该命令会输出现有元 XML 的路径(优先使用嵌套布局,若不存在则回退到扁平布局)。始终通过 node 调用(切勿直接执行),以确保在 Windows、macOS 和 Linux 上均可正常工作。就地编辑该确切文件;不要在另一条路径下创建第二个文件,也不要将文件迁移到其他布局,这是此技能不应执行的操作。
如果步骤 2 确认 UIBundle 上存在 target 字段,请在该文件现有的 <UIBundle> 元素内添加 <target>CustomApplication</target>,并保持所有其他现有元素和值不变(如果组织的 API 版本中不存在该字段,则完全跳过此步骤——不要创建文件或添加 <target>)。
不要:
- 创建新的
.uibundle-meta.xml文件 - 在已有
.uibundle-meta.xml文件(无论是嵌套还是扁平布局)的其他路径下再创建一个 - 在其他位置添加
<target>,却不修改原有的uiBundles/{appName}/{appName}.uibundle-meta.xml(或者现有布局为扁平布局时的uiBundles/{appName}.uibundle-meta.xml)
此技能唯一会生成或修改的文件是 applications/{appName}.app-meta.xml(新建)和现有的 {appName}.uibundle-meta.xml(仅当适用 <target> 时就地编辑)。输出中出现任何其他与 UI Bundle 相关的文件都属于错误。
已完全更新文件的示例(位于 uiBundles/{appName}/{appName}.uibundle-meta.xml;如果现有布局为扁平布局,则位于扁平路径)——此示例展示的是现有文件的最终状态,而不是要创建的新文件:
<?xml version="1.0" encoding="UTF-8"?>
<UIBundle xmlns="http://soap.sforce.com/2006/04/metadata">
<masterLabel>{appName}</masterLabel>
<description>A Salesforce UI Bundle.</description>
<isActive>true</isActive>
<version>1</version>
<target>CustomApplication</target>
</UIBundle>
步骤 6:不要修改非模板化属性
不要修改 CustomApplication 元数据中任何未以 {大括号} 包裹变量形式表示的默认属性值。
验证清单
部署前,请确认:
- 所有必需属性均已解析
- 已查询 API 上下文以确定可用字段(步骤 2)
-
applications/{appName}.app-meta.xml已存在且内容正确 - 捆绑包引用字段与组织的 API 版本匹配(
<uiBundle>或<webApplication>) - 如果支持
target字段:现有的{appName}.uibundle-meta.xml(位于uiBundles/{appName}/下的嵌套路径,或uiBundles/下的扁平路径,取决于原有布局)包含<target>CustomApplication</target> - 未创建额外的
.uibundle-meta.xml文件——恰好存在一个{appName}.uibundle-meta.xml,且位于原有路径 - 部署验证成功:
sf project deploy validate --metadata CustomApplication UIBundle --target-org ${usernameOrAlias}