本文参考了在以下情况下使用的基于 YAML 的源代码管理格式:
- 在 Power Apps 中使用本机 Dataverse Git 集成提交解决方案。
- 使用
pac solution clone或pac solution sync. 提取解决方案。 - 针对包含 YAML 清单文件的文件夹手动运行 SolutionPackager。
YAML 格式不同于经典 XML 布局。 若要将 YAML 文件夹手动打包回 .zip Dataverse 可以导入的文件,了解结构非常重要。
重要
pac CLI 中的 YAML 源代码管理格式支持需要Microsoft。PowerApps.CLI 2.4.1 或更高版本。 从
文件夹结构概述
YAML 格式存储库根目录包含以下顶级目录:
<repositoryRoot>/
├── solutions/
│ └── <SolutionUniqueName>/ (one subfolder per solution)
│ ├── solution.yml
│ ├── solutioncomponents.yml
│ ├── rootcomponents.yml
│ └── missingdependencies.yml
├── publishers/
│ └── <PublisherUniqueName>/ (one subfolder per publisher)
│ └── publisher.yml
├── entities/ (entity components, if any)
│ └── <entity_schema_name>/
│ ├── attributes/
│ ├── formxml/
│ ├── savedqueries/
│ └── ...
├── workflows/ (classic workflow definitions, if any)
├── modernflows/ (Power Automate cloud flows, if any)
├── canvasapps/ (canvas app .msapp files, if any)
│ └── <canvas_app_schema_name>/
│ └── <name>.msapp
├── environmentvariabledefinitions/ (environment variable definitions, if any)
├── connectors/ (custom connectors, if any)
└── [other component folders]/
需要 solutions/ 目录和 publishers/ 目录。 根目录中的所有组件文件夹都是可选的,具体取决于解决方案包含的内容。
重要
所有 YAML 清单文件(solution.yml等 publisher.yml)都必须放置在各自的子目录(solutions/<name>/, ) publishers/<name>/下。 将它们置于存储库根目录可阻止格式检测,并导致 SolutionPackager 工具回退到 XML 格式,从而产生有关缺失 Customizations.xml的误导性错误。 详细信息: SolutionPackager 工具故障排除
设置自动检测的格式
SolutionPackager (和 pac solution pack) 自动检测格式,如下所示:
| 条件 | 检测到的格式 | 行为 |
|---|---|---|
solutions/*/solution.yml 找到 — 一个解决方案 |
YAML | 从子文件夹名称推断的解决方案名称 |
solutions/*/solution.yml 找到 — 多个解决方案 |
YAML |
/SolutionName 指定要打包的解决方案所需的参数 |
不存在 solutions/ 子目录 |
XML (旧版) |
Other\Solution.xml预期和Other\Customizations.xml |
清单文件
solution.yml
位于 solutions/<SolutionUniqueName>/solution.yml. 包含顶级解决方案元数据 - 与 XML 格式等效的 solution.xml YAML。
关键字段包括解决方案的唯一名称、版本、友好名称、说明和对发布者的引用。
solutioncomponents.yml
位于 solutions/<SolutionUniqueName>/solutioncomponents.yml. 列出此解决方案中包含的所有组件文件的相对路径。 SolutionPackager 在包期间读取此文件以查找组件源。
示例摘录:
- Path: entities/account
- Path: entities/contact
- Path: canvasapps/myapp_<guid>
- Path: publishers/MyPublisher
rootcomponents.yml
位于 solutions/<SolutionUniqueName>/rootcomponents.yml. 列出属于此解决方案的根级组件(通常是表和其他顶级对象)。
注释
如果组件声明在其中rootcomponents.yml,但其源文件不在文件夹中(例如,下面的canvasapps/<name>/画布应用.msapp文件),SolutionPackager 会发出警告,并省略打包.zip的组件。 包操作仍然使用退出代码 0 成功完成。
包成功不能保证导入成功。 如果 solutioncomponents.yml 省略了所需的依赖项路径(如父实体文件夹或关系定义), entityrelationships/ 则解决方案包不会出错,但在导入时失败,并显示如下消息: “属性缺少关联的关系定义。 始终确保 solutioncomponents.yml 包括所有依赖实体和关系,而不仅仅是解决方案拥有的实体和关系。
missingdependencies.yml
位于 solutions/<SolutionUniqueName>/missingdependencies.yml. 记录上次导出解决方案时不存在的任何解决方案依赖项。 用于信息性目的,并验证导入的完整性。
publisher.yml
位于 publishers/<PublisherUniqueName>/publisher.yml. 包含发布者定义 - 唯一名称、显示名称、自定义前缀和选项值前缀。
所需的结构最少:
Publisher:
UniqueName: mypublisher
LocalizedNames:
LocalizedName:
'@description': My Publisher
'@languagecode': '1033'
Descriptions:
EMailAddress:
'@xsi:nil': 'true'
'@xmlns:xsi': http://www.w3.org/2001/XMLSchema-instance
SupportingWebsiteUrl:
'@xsi:nil': 'true'
'@xmlns:xsi': http://www.w3.org/2001/XMLSchema-instance
CustomizationPrefix: myp
CustomizationOptionValuePrefix: '12345'
Addresses:
组件类型支持
下表列出了如何以 YAML 格式处理每个组件类型。
| 组件类型 | 采用 YAML 格式 | 备注 |
|---|---|---|
| 实体(表)、属性、窗体、视图 | • YAML 文件 | 每个子组件存储为单个 YAML 文件 |
| 工作流(经典) | • YAML 文件 | (位于 workflows/ 下面) |
| 新式流(Power Automate云流) | • — 仅 YAML 格式 | 在 ;下 modernflows/,XML 格式不受支持 |
| 画布应用 | • — 仅 YAML 格式 |
.msapp 二进制;在 XML 格式下 canvasapps/<name>/不受支持 |
| 环境变量定义 | ✔ XML 文件 | 下面的单个 .xml 文件 environmentvariabledefinitions/ |
| 环境变量值 | ✔ JSON 文件 | 存储为 environment_variable_values.json |
| 自定义连接器 | ✓ | (位于 connectors/ 下面) |
| 插件程序集 | ✓ | 默认情况下重新映射完全限定的类型名称 (/remapPluginTypeNames) |
| Web 资源 | ✓ | (位于 webresources/ 下面) |
| 安全角色 | ✓ | 在内部存储为 XML;按解决方案筛选 |
| 选项集 (全局) | ✓ | 存储为 XML;按解决方案筛选 |
| 仪表板 | ✓ | 存储为 XML;按解决方案筛选 |
| 站点地图 | ✓ | 存储为 XML;按解决方案筛选 |
| 功能区自定义 | ✓ | 存储为 XML;按解决方案筛选 |
| 实体关系 | ✓ | (位于 entityrelationships/ 下面) |
注释
在打包和解压缩操作期间,在 XML 和 YAML 之间自动转换存储为 XML 的组件。 可以将它们创作为 YAML 文件;该工具处理转换。
多解决方案存储库
单个存储库根可以包含多个解决方案。 所有解决方案共享相同的组件文件夹; solutioncomponents.yml 中的每个解决方案都控制哪个组件路径属于该解决方案。
包含两个解决方案的示例结构:
<repositoryRoot>/
├── solutions/
│ ├── SolutionA/
│ │ ├── solution.yml
│ │ ├── solutioncomponents.yml ← references entities/account, entities/contact
│ │ ├── rootcomponents.yml
│ │ └── missingdependencies.yml
│ └── SolutionB/
│ ├── solution.yml
│ ├── solutioncomponents.yml ← references entities/lead, workflows/myflow
│ ├── rootcomponents.yml
│ └── missingdependencies.yml
├── publishers/
│ └── SharedPublisher/
│ └── publisher.yml
├── entities/
│ ├── account/
│ ├── contact/
│ └── lead/
└── workflows/
└── myflow/
从多解决方案文件夹中打包特定解决方案
使用 SolutionPackager.exe:
SolutionPackager.exe /action:Pack /zipfile:SolutionA.zip /folder:C:\repos\myrepo /SolutionName:SolutionA
仅使用 pac solution pack (仅单解决方案文件夹 - 对于多解决方案,请直接使用 SolutionPackager.exe):/SolutionName
pac solution pack --zipfile SolutionA.zip --folder C:\repos\myrepo
注释
使用本机 Dataverse Git 与环境绑定集成时,环境中的所有解决方案都使用多解决方案布局共享单个存储库根目录。 使用解决方案绑定时,每个解决方案都可以绑定到单独的文件夹。
使用 YAML 格式文件夹
将 YAML 文件夹打包到 .zip 文件中
# Using pac CLI (single solution in folder)
pac solution pack --zipfile C:\output\MySolution.zip --folder C:\repos\myrepo
# Using SolutionPackager.exe directly (also works for multi-solution with /SolutionName)
SolutionPackager.exe /action:Pack /zipfile:C:\output\MySolution.zip /folder:C:\repos\myrepo
从 Dataverse 获取完整的 YAML 文件夹
获取完整、可打包的 YAML 文件夹的建议方法是使用 pac solution clone:
pac solution clone --name MySolutionUniqueName --outputDirectory C:\repos\myrepo
这会将解决方案提取为 YAML 格式,包括所有组件源文件。 或者,使用本机 Git 集成从Power Apps提交 — 提交的文件采用 YAML 格式且完全可打包。
在打包之前验证文件夹
solutions/<name>/检查文件夹是否存在,以及解析为实际文件的所有路径solutioncomponents.yml。 任何缺失的路径都会导致包期间出现警告,并省略这些组件。
与 Dataverse Git 集成的关系
YAML 源代码管理格式是 Dataverse Git 集成使用的规范格式。 当创建者提交来自Power Apps的解决方案时,写入Azure DevOps的文件使用此格式。 代码优先开发人员可以使用此处所述的 CLI 工具处理同一存储库。
有关将环境连接到 Git 的信息,请参阅 Dataverse Git 集成设置。