解决方案用于分发 Power Platform 对象,如应用程序、表、流、网络资源和插件。 本文将介绍解决方案检查器功能,这是一个功能强大的工具,可根据一组最佳实践规则对解决方案对象执行全面的静态分析。 通过使用解决方案检查器,您可以快速识别组件中的问题模式,并接收详细的报告,其中突出显示问题、受影响的组件,并提供有关如何解决每个问题的文档的链接。 这可确保您的解决方案在性能、稳定性和可靠性方面得到优化。
解决方案检查器适用于可从某个环境中导出的非托管解决方案。
您可以从 Power Apps (make.powerapps.com) 或使用 PowerShell 运行解决方案检查器。
解决方案检查器如何为您提供帮助
为了满足复杂的业务需求,制作者最终可能会采用非常高级的解决方案,对 Power Platform 进行定制和扩展。 高级实施伴随着风险上升,并带来性能、稳定性和可靠性问题,从而影响用户的体验。 确定这些问题和了解其解决方法可能非常复杂,并且很费时间。 利用解决方案检查器功能,您可以在几秒钟内对解决方案进行检查,该功能使用一套最佳实践规则来快速识别有问题的模式。 检查完成后,您会在 Power Apps 和电子邮件中收到一份详细报告,其中列出了发现的问题、受影响的组件和代码,以及说明如何解决每个问题的文档链接。
解决方案检查器分析以下解决方案组件:
- Dataverse 自定义工作流活动
- Dataverse Web 资源(HTML 和 JavaScript)
- Dataverse 配置,例如 SDK 消息处理步骤
- Power Automate 流(通过流检查器)
- Power Fx 表达式(通过应用检查器)
备注
- 解决方案检查器支持 ECMAScript 2015 (ES6) 及最高至 ECMAScript 2018 (ES9) 语法中的全局变量。 当检测到 JavaScript 使用了 ES6 之后版本中的全局变量或 ES9 之后的语法时,会为该 Web 资源报告 web-unsupported-syntax 问题。
- 使用解决方案检查程序并不能保证解决方案导入成功。 针对解决方案执行的静态分析检查并不了解目标环境的配置状态,导入成功与否可能取决于环境中的其他解决方案或配置。
运行解决方案检查器
登录到 Power Apps。
在左侧窗格中选择解决方案。 如果项目不在侧面板窗格中,请选择 …更多,然后选择所需项目。
在要分析的非托管解决方案旁边,选择 ...,指向解决方案检查器,然后选择运行。
解决方案检查器命令按钮上有一个加载指示器,您会在解决方案列表的解决方案检查列中发现一个正在运行...状态。
备注
- 解决方案检查器可能需要几分钟才能完成分析。
- 检查完成后,您将收到电子邮件通知,Power Apps 站点的通知区域中也会显示通知。
- 检查完成后查看报告。
取消检查
在环境中提交解决方案检查之后,可以通过解决方案页面右上区域中的状态窗格取消检查。
如果取消检查,将停止运行解决方案检查,而解决方案检查状态将恢复为之前的状态。
解决方案检查器的状态
在环境中安装解决方案检查器之后,解决方案列表中将提供解决方案检查列。 此列显示某个解决方案的分析状态。
| 状态 | 说明 |
|---|---|
| 尚未运行 | 从未分析解决方案。 |
| 运行中 | 正在分析解决方案。 |
| 无法完成 | 已请求分析解决方案,但是未成功完成。 |
| 截止日期和时间的结果 | 解决方案分析完成,可下载结果。 |
| 无法完成。 截止日期和时间的结果 | 最近的分析请求未成功完成。 可以下载最近的成功结果。 |
| 由 Microsoft 检查 | 这是由 Microsoft 管理的解决方案。 不允许对这些解决方案进行解决方案分析。 |
| 已由发布者检查 | 这是一个非 Microsoft 管理的解决方案。 现在不能对这些解决方案进行解决方案分析。 |
查看解决方案检查器报告
完成解决方案检查之后,可以在门户中查看分析报告,也可以从 Web 浏览器下载该报告。 门户中有用于按问题、位置或严重性对结果进行排序,以及查看解决方案中检测到的问题的详细信息的选项。
在左侧窗格中选择解决方案。 如果项目不在侧面板窗格中,请选择 …更多,然后选择所需项目。
在要查看解决方案检查器报告的非托管解决方案旁边,选择 ...,指向解决方案检查器,然后选择查看报告。
选择问题以查看详细信息和有关如何解决的说明。
也可以下载解决方案检查结果。 将把解决方案检查器 zip 文件下载到 Web 浏览器指定的文件夹。 下载报告采用 Excel 格式,包含多个可视化和列,可帮助您确定解决方案中检测到的每个问题的影响、类型和位置。 还提供了有关如何解决问题的详细指示信息的链接。
- 在左侧窗格中选择解决方案。 如果项目不在侧面板窗格中,请选择 …更多,然后选择所需项目。
- 在要下载解决方案检查器报告的非托管解决方案旁边,选择 ...,指向解决方案检查器,然后选择下载报告。
- 将把解决方案检查器 zip 文件下载到 Web 浏览器指定的文件夹。
下面是报告中每列的摘要。
| 报表列 | 说明 | 适用于组件 |
|---|---|---|
| 问题 | 解决方案中确定的问题的标题。 | 所有 |
| 类别 | 识别到的问题分类,如性能、可维护性、使用情况、可支持性、设计、安全性、辅助功能或升级就绪情况。 | 所有 |
| 严重级别 | 表示确定的问题的潜在影响。 可用影响类型为严重、高、中、低和参考。 | 所有 |
| 指南 | 详细说明问题、影响和建议操作的文章的链接。 | 所有 |
| 组件 | 识别出该问题的解决方案组件。 | 所有 |
| 位置 | 确定发生了问题的组件的位置和/或源文件,如程序集或 JavaScript 文件名。 | 所有 |
| 行号 | 受影响的 Web 资源组件中问题的行号引用。 | Web 资源 |
| 模块 | 在程序集中检测到该问题的模块名称。 | 自定义工作流活动 |
| 类型 | 程序集内识别出的问题类型。 | 自定义工作流活动 |
| 成员 | 在程序集中确定的问题的编号。 | 自定义工作流活动 |
| 语句 | 导致问题的代码语句或配置。 | 所有 |
| 注释 | 包含高级别解决方法步骤的问题相关详细信息。 | 所有 |
在本地运行解决方案检查器规则
您可以在开发环境中运行解决方案检查器规则,以在创建解决方案资源时更快地检测问题。 目前,Web 资源(JavaScript 和 TypeScript)支持此功能。 有关详细信息,请访问 NPM 包 @microsoft/eslint-plugin-power-apps。
使用 PowerShell 运行解决方案检查器
可使用 PowerShell 模块直接与服务交互。 Microsoft.PowerApps.Checker.PowerShell 模块可用于对 Power Apps 环境的非托管解决方案进行分析,或自动化服务并将服务集成到您的版本和发布管道中。 详细信息:Microsoft.PowerApps.Checker.PowerShell 概述
解决方案检查器使用的最佳实践规则
下表列出了组件类型、规则描述、严重性和类别。 为托管环境配置解决方案检查器强制执行后,严重违规会被阻止或发出警告。 详细信息:在托管环境中使用解决方案检查器
| 解决方案组件 | 规则名称 | 规则说明 | 严重级别 | 类别 |
|---|---|---|---|---|
| 插件或工作流活动 | meta-remove-dup-reg | 避免重复的 Dataverse 插件注册。 | 严重 | 绩效 |
| 插件或工作流活动 | meta-avoid-reg-no-attribute | 在 Dataverse 插件注册中包括筛选属性 | 中等 | 绩效 |
| 插件或工作流活动 | meta-avoid-reg-retrieve | 使用为 Retrieve 和 RetrieveMultiple 消息注册的 Dataverse 插件时,请务必小心谨慎。 | 中等 | 绩效 |
| 插件或工作流活动 | meta-remove-inactive | 删除 Dataverse 中已停用的配置 | 低 | 可维护性 |
| 插件或工作流活动 | meta-avoid-crm4-event | 请勿使用 Microsoft Dynamics CRM 4.0 插件注册阶段。 | 中等 | 升级就绪状态 |
| 插件或工作流活动 | meta-avoid-retrievemultiple-annotation | 避免在批注 RetrieveMultiple 上注册插件。 | 高 | 用法 |
| 模型驱动应用 | Meta 许可销售实体运营 | 解决方案包含其 SDK 消息和操作受限且需要有效的 Dynamics 365 许可证的实体。 | 低 | 许可 |
| 模型驱动应用 | meta-license-fieldservice-customcontrols | 解决方案包含需要有效 Dynamics 365 Field Service 许可证的自定义控件。 | 低 | 许可 |
| 模型驱动应用 | meta-license-fieldservice-entity-operations | 解决方案包含一些实体,这些实体带有受限的 SDK 消息和操作,而这些消息和操作需要有效的 Dynamics 365 Field Service 许可证。 | 低 | 许可 |
| Web 资源 | use-async | 与 HTTP 和 HTTPS 资源异步交互。 | 严重 | 绩效 |
| Web 资源 | avoid-modals | 避免使用模式对话框。 | 高 | 可支持性 |
| Web 资源 | avoid-dom-form | 高 | 可支持性 | |
| Web 资源 | avoid-dom-form-event | 高 | 可支持性 | |
| Web 资源 | avoid-crm2011-service-odata | 请勿以 Microsoft Dynamics CRM 2011 OData 2.0 端点为目标。 | 严重 | 升级就绪状态 |
| Web 资源 | avoid-crm2011-service-soap | 请勿以 Microsoft Dynamics CRM 2011 SOAP 服务为目标。 | 严重 | 升级准备情况 |
| Web 资源 | avoid-loadtheme | 请勿使用 loadTheme Fluent v8 API。 |
低 | 可支持性 |
| Web 资源 | avoid-browser-specific-api | 请勿使用 Internet Explorer 旧 API 或浏览器插件。 | 严重 | 升级准备情况 |
| Web 资源 | avoid-unpub-api | 高 | 可支持性 | |
| Web 资源 | 避开窗口顶部 | 高 | 可支持性 | |
| Web 资源 | avoid-2011-api | 请勿使用已弃用的 Microsoft Dynamics CRM 2011 对象模型。 而是按照 Dataverse Web API 文档操作。 | 高 | 升级就绪情况 |
| Web 资源 | use-relative-uri | 请勿使用 Dataverse 端点的绝对 URL。 | 中等 | 可维护性 |
| Web 资源 | use-cached-webresource | 中等 | 绩效 | |
| Web 资源 | use-client-context | 使用客户端上下文。 | 中等 | 升级就绪状态 |
| Web 资源 | use-navigation-api | 使用导航 API 参数。 | 中等 | 升级准备情况 |
| Web 资源 | 离线使用 | 中 | 升级就绪情况 | |
| Web 资源 | 不要作父级假设 | 高 | 设计 | |
| Web 资源 | use-org-setting | 使用组织设置。 | 中等 | 升级准备情况 |
| Web 资源 | use-global-context | 中等 | 升级就绪情况 | |
| Web 资源 | use-grid-api | 使用网格 API。 | 中等 | 升级就绪情况 |
| Web 资源 | 使用实用程序对话框 | 中等 | 用法 | |
| Web 资源 | avoid-isActivityType | 将 Xrm.Utility.isActivityType 方法替换为新的 Xrm.Utility.gettableMetadata,并且不在功能区规则中使用。 | 中等 | 升级准备情况 |
| Web 资源 | meta-avoid-silverlight | 已弃用 Silverlight Web 资源。 | 中 | 升级准备情况 |
| Web 资源 | remove-debug-script | 避免在非开发环境中包含调试脚本。 | 中等 | 用法 |
| Web 资源 | use-strict-mode | 如果可能,使用严格模式。 | 中等 | 用法 |
| Web 资源 | use-strict-equality-operators | 使用绝对相同的运算符。 | 中等 | 用法 |
| Web 资源 | avoid-eval | 不要使用 eval 函数或其功能等效项。 |
严重 | 安全性 |
| Web 资源 | avoid-with | 不要使用“with”运算符。 | 高 | 绩效 |
| Web 资源 | remove-alert | 不要使用“alert”函数或其功能等效项。 | 中等 | 用法 |
| Web 资源 | remove-console | 避免使用 console 上的方法。 | 中等 | 用法 |
| Web 资源 | avoid-ui-refreshribbon | 避免在窗体加载时和 EnableRule 中使用 refreshRibbon。 | 严重 | 绩效 |
| Web 资源 | use-getsecurityroleprivilegesinfo | 避免使用 userSettings.securityRolePrivileges。 改为使用 userSettings.getSecurityRolePrivilegesInfo。 | 高 | 绩效 |
| Web 资源 | use-appsidepane-api | 使用 Xrm.App.sidePanes.createPane,而非 Xrm.Panels.loadPanel。 | 中等 | 升级准备情况 |
| Web 资源 | web-sdl-no-cookies | HTTP Cookie 是一种旧的客户端存储机制,具有固有的风险和限制。 请使用 Web 存储、IndexedDB 或其他现代方法。 | 中等 | 安全性 |
| Web 资源 | web-sdl-no-document-domain | 必须审查对 document.domain 属性的写入操作,从而避免绕过同源检查。 严禁使用顶级域名,如 azurewebsites.net。 | 中等 | 安全性 |
| Web 资源 | web-sdl-no-document-write | 对 document.write 或 document.writeln 的调用可以在不进行任何清理的情况下直接操作 DOM,应该避免。 请改为使用 document.createElement() 或类似方法。 | 中等 | 安全性 |
| Web 资源 | web-sdl-no-html-method | 直接调用方法 html()(例如在 jQuery 框架中)通常会在不进行任何清理的情况下直接操作 DOM,应该避免。 请改为使用 document.createElement() 或类似方法。 | 中等 | 安全性 |
| Web 资源 | web-sdl-no-inner-html | 对 innerHTML 或 outerHTML 属性的分配可以在不进行任何清理的情况下直接操作 DOM,应该避免。 请改为使用 document.createElement() 或类似方法。 | 中等 | 安全性 |
| Web 资源 | web-sdl-no-insecure-url | 不安全协议(如 HTTP 或 FTP)应替换为加密的对等协议(HTTPS、FTPS),以避免通过不受信任的网络以纯文本发送可能的敏感数据。 | 中等 | 安全性 |
| Web 资源 | web-sdl-no-msapp-exec-unsafe | 对 MSApp.execUnsafeLocalFunction() 的调用会绕过脚本注入验证,应该避免。 | 中等 | 安全性 |
| Web 资源 | web-sdl-no-postmessage-star-origin | 使用 postMessage 向其他窗口发送数据时,应始终提供具体的目标源,而不要使用 *,以避免数据泄露到信任边界之外。 | 中等 | 安全性 |
| Web 资源 | web-sdl-no-winjs-html-unsafe | 调用 WinJS.Utilities.setInnerHTMLUnsafe() 和类似方法不会执行任何输入验证,因此应避免使用。 请改为使用 WinJS.Utilities.setInnerHTML()。 | 中等 | 安全性 |
| 画布应用 | app-formula-issues-high | 更多详情,请参阅 Power Apps 公式参考。 | 严重 | 设计 |
| 画布应用 | 应用-公式-问题-中 | 有关更多详细信息,请参阅 Power Apps 公式参考。 | 中等 | 设计 |
| 画布应用 | 应用-公式-问题-低 | 有关详细信息,请参阅 Power Apps 公式参考。 | 低 | 设计 |
| 画布应用 | 应用-使用-delayoutput-文本-输入 | 在某些情况下使用延迟加载来提高性能。 | 中等 | 绩效 |
| 画布应用 | 应用-缩小-屏幕-控件 | 限制应用控件数量以提高性能。 | 中等 | 绩效 |
| 画布应用 | 应用-包含-无障碍标签 | 使用显式标签改进应用的可访问性。 | 中等 | 辅助功能 |
| 画布应用 | 应用-包含-备选-输入 | 确保所有交互元素都可以访问备选输入。 | 中等 | 辅助功能 |
| 画布应用 | app-avoid-autostart | 避免在应用内的播放器上使用自动启动。 | 中等 | 辅助功能 |
| 桌面流程 | desktopflow-avoid-unsafe-password | 密码在流程中的管理不安全。 | 高 | 安全性 |
| 桌面流程 | desktopflow-avoid-subflow-recursion | 检测到子流程之间存在递归调用,这可能导致无限循环。 | 中等 | 设计 |
| 桌面流程 | desktopflow-avoid-infinite-loop | 在流中检测到无限循环,这可能会导致流无限运行。 | 中等 | 设计 |
| 桌面流程 | desktopflow-avoid-incomplete-if-branch | 如果检测到操作、缺少内容或仅包含 Else 分支中的操作,则不完整。 | 低 | 设计 |
| 桌面流程 | desktopflow-avoid-excessive-nested-ifs | 嵌套的 if 语句超过五层。 | 低 | 可维护性 |
| 桌面流程 | desktopflow-avoid-empty-on-error-block | “发生块错误时”操作为空,且未处理错误。 | 低 | 设计 |
| 桌面流程 | desktopflow-limit-argument-count | 输入/输出变量总数超过 25 个变量的限制。 | 低 | 可维护性 |
| 桌面端流程 | 桌面流输入参数默认值 | 输入/输出变量未使用默认值。 | 低 | 可维护性 |
| 桌面端流程 | desktopflow-limit-variable-name-length | 变量名称超过 25 个字符的限制。 | 低 | 可维护性 |
| 桌面端流程 | desktopflow-避免过多的等待操作 | 检测到 wait 操作使用不当,超过 10 个 wait 操作可能导致潜在瓶颈。 | 低 | 绩效 |
| 桌面流程 | desktopflow-avoid-immense-wait-duration | 检测到超长等待时间,超过了硬编码等待操作的 600 秒限制。 | 低 | 绩效 |