尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RibbonWorkbench 2016:Dynamics 365命令栏定制与部署完全指南

RibbonWorkbench 2016:Dynamics 365命令栏定制与部署完全指南 简介面向Dynamics 365和Power Apps开发者的RibbonWorkbench托管管理包旨在帮助开发者直观定制命令栏Ribbon元素摆脱手写XML的繁琐提升界面配置与投放效率。压缩包约1.48MB内含解决方案定义、Web资源、插件程序集等核心组件同时提供大量可复用的命令按钮、菜单项及脚本资源可用于导入Dynamics 365环境进行功能扩展与个性化界面设计。资源已有179人学习/下载。借助该工具开发者可以可视化设计Ribbon布局拖拽式完成按钮、分组与图标的调整快速部署到测试或生产环境并集成源代码控制系统便于团队协作与版本管理。同时内置预览与回滚功能降低误操作风险让开发者从繁琐的UI定制中抽身更专注于核心业务逻辑实现尤其适合具备一定Dynamics平台基础、正在优化实体命令栏或需要批量定制界面的中高级开发人员。1. RibbonWorkbench 2016Dynamics 365 命令栏开发的 managed 利器做 Dynamics 365 定制开发的人早晚要碰命令栏Ribbon。很多人还在手动改 RibbonDiffXml改错一个节点就整段白给。RibbonWorkbench2016_3_1_443_1_managed.zip 不是一个演示工程而是一套能直接导入 Dynamics 365 环境的 managed 解决方案——里面带了命令栏可视化编辑器的全部 Web 资源和一整套定制基础设施。装上它你可以在图形界面里拖按钮、挂命令、绑脚本生成的东西再也不用靠纯手写 XML 硬撑。适合正在做 Dynamics 365 和 Power Apps 界面定制、想压低重复劳动和出错率的开发者、实施顾问也适合给客户环境做快速交付的团队。2. managed 与 Ribbon 工作原理先弄清这个 zip 改了哪里2.1 managed 和 unmanaged部署前先选对阵营接手这个包之前得先明白一件事文件名里那个 managed 不是白写的。Dynamics 365 里有 managed 和 unmanaged 两种解决方案形态区别相当于「打包好的成品」和「开放修改的半成品」。managed 包里的组件在导入后被锁定不能直接修改单个组件只能整个解决方案卸载unmanaged 则可以随时编辑里面的元素。RibbonWorkbench 这个包是 managed 形态说明它的定位是往测试或生产环境直接部署的工具层而不是给你在开发环境里反复改源码用的。从实施角度看我一般建议开发环境装 unmanaged 版本、集成或生产环境装 managed 版本。这样开发时能直接改发布后又能保证环境里没人动了不该动的东西。如果你只有一个环境那就直接装 managed也能正常用只是后续想改 RibbonWorkbench 自身的组件属性会麻烦一些。这里先给出两边的核心对比后面章节里提到的坑大半都跟这个形态选择有关。形态组件可编辑卸载方式适合场景managed锁定整个解决方案卸载测试/生产部署unmanaged开放逐组件删除或整体删除开发/调试提示同一个解决方案的 managed 和 unmanaged 不要装到同一个环境不然会出现组件归属混乱查问题的时候特别头疼。2.2 customizations.xml 是命令栏改动的黑匣子这个 zip 里最值得关注的文件是 customizations.xml。它记录了该解决方案对命令栏的所有改动包括按钮、命令定义、EnableRules、DisplayRules以及每个按钮挂的 JavaScript 函数。RibbonWorkbench 的可视化操作最终都会汇入这个 XML。简单说Dynamics 365 的命令栏不是靠拖控件存的而是靠 XML 描述的。RibbonWorkbench 只是把这个黑匣子打开给你看。手动读一遍这份 XML 是理解整个定制链路的基础也方便在工具出问题时直接下手修。RibbonDiffXml CustomActions CustomAction Idnew.ribbon.CustomAction.Account.Button LocationMscrm.SubGrid.account.MainTab.Management._children CommandUIDefinition Button Idnew.ribbon.Button.Account.DoSomething Commandnew.ribbon.Command.Account.DoSomething Sequence100 / /CommandUIDefinition /CustomAction /CustomActions CommandDefinitions CommandDefinition Idnew.ribbon.Command.Account.DoSomething EnableRules EnableRule Idnew.ribbon.Rule.Always / /EnableRules DisplayRules DisplayRule Idnew.ribbon.Rule.Always / /DisplayRules Actions JavaScriptFunction Library$WebResource:new_ribbon_helper.js FunctionNamenewRibbonHelper.doSomething / /Actions /CommandDefinition /CommandDefinitions /RibbonDiffXml这段 XML 是命令栏定制最常见的一个骨架先在 CustomActions 里声明按钮放在哪个区域然后在 CommandDefinitions 里定义按钮点击后执行什么动作。Location 里的_children后缀表示把按钮追加到该区域末尾Sequence 控制按钮排序。JavaScriptFunction 里的 Library 指向的 WebResource 必须在解决方案里存在否则按钮能显示但点了没反应。前几年我见过不少翻车案例都是改 XML 时漏了 EnableRules按钮永远灰着或者函数名大小写不对点击后控制台静默无响应。手动写几遍这个结构再回工具里对照看理解进度会快很多。2.3 版本号 2016_3_1_443_1 里能读出什么信息版本号是 2016_3_1_443_1看着长其实能拆成几段来读。2016 说明这个工具主线是跟着 Dynamics 2016/CRM 2016 那一代平台走的3_1 是主次版本443 是构建号最后的 1 是修订号整体上属于那一代里比较成熟的稳定构建功能上已经包含了命令栏可视化编辑、解决方案导入导出、WebResource 管理这些核心能力。需要注意老版本的 RibbonWorkbench 对新环境的兼容性并不总是理想。装之前先确认目标环境的主版本。如果是 Dynamics 365 Online 或者更新的 Power Apps 平台这个 2016 代的工具大概率能用但某些显示规则和命令 API 的行为可能有细微差别。我见过有人在最新环境上装老工具按钮显示正常但脚本里用的旧 API 已经在新平台里被标记为不推荐控制台抛出一堆 managed 调用栈级别的警告。说实话这类警告多数不影响功能但如果你对接的是严格的项目交付审计日志里带着这些警告总归不好看。所以先对齐环境版本和工具版本再动手装能省掉后面一大半排查工作。3. 解压导入与首次检查把 zip 变成可用的解决方案3.1 解压前先做文件体检我拿到任何 zip 包的第一个习惯是先做完整性检查而不是直接解压。RibbonWorkbench 这个包虽然不算大但如果文件头损坏导入到一半报错排查起来比解压时多花三倍时间。# Windows 上可以用 tar 配合转储或直接用 7-Zip 做测试macOS/Linux 直接 unzip unzip -t RibbonWorkbench2016_3_1_443_1_managed.zip-t参数是测试模式只校验每个文件的 CRC不真正展开。如果输出里出现unexpected end of file或某个文件校验失败说明压缩包已经损坏这时候不要硬解压重新找一份完整的下载。还有一种常见情况是 zip 伪加密——文件被标记为有密码但实际内容并没有真正加密解压工具会一直问你要密码。这种现象多见于从网盘转存过的文件处理办法是换个解压工具比如 7-Zip 打开后重新复制一份出来通常就能绕过去。文件没问题之后再解压看结构。一个标准的 Dynamics 365 解决方案包里面应该有这些内容文件/目录作用备注solution.xml解决方案元数据含版本、发布者导入时校验依赖的依据customizations.xml所有自定义组件的定义命令栏改动集中在这里[Content_Types].xml文件类型声明缺了它导入工具不认识文件WebResources/HTML/JS/CSS 等前端资源RibbonWorkbench 的界面和脚本PluginAssemblies/已编译的 .NET 程序集业务逻辑代码所在Workflows/工作流与流程定义自动化逻辑这个结构是 Dynamics 365 解决方案的标准形态不只是 RibbonWorkbench 如此。你学会检查这个包以后任何第三方解决方案包都能用同样方法做体检。3.2 solution.xml 告诉环境该怎么装检查完文件结构第二步是打开 solution.xml 看元数据。它决定了这个解决方案能不能在当前环境装、装的时候会不会缺依赖。ImportExportXml SolutionManifest UniqueNameRibbonWorkbench/UniqueName Version3.1.443.1/Version Managed1/Managed /SolutionManifest /ImportExportXml这段是 solution.xml 最核心的部分。UniqueName 是解决方案的唯一标识Version 必须和你的环境状态匹配Managed 为 1 表示这是 managed 包。如果环境里已经存在同名且版本号更高的解决方案导入会被直接拦住。另外解决方案清单里如果声明了依赖组件目标环境必须先装好被依赖的部分不然导入会以「缺少必要组件」告终。我一般会顺手把 solution.xml 里的发布者信息和 UniqueName 记到笔记里后面排查组件归属冲突的时候这两个字段能快速定位到责任方不用再回压缩包里翻。3.3 导入 Dynamics 365 的两种路径检查完就可以导入了。常见路径有两条。第一条是走 Dynamics 365 的 Web 界面。登录后进入「设置 → 解决方案 → 导入」选择刚才解压出来的 zip也可以直接选原 zip不用解压按向导的提示依次操作。导入过程会先做一次静态校验如果方案有问题界面会直接给出错误码适合不常做部署的人能直观看到每一步的状态。第二条是用 PowerShell 批量处理。如果你的交付里包含多个解决方案或者要往开发、测试、生产三套环境同时推送脚本化明显更省事。Import-PowerAppsSolution -EnvironmentName env-crm-test -SolutionFilePath C:\packages\RibbonWorkbench2016_3_1_443_1_managed.zip -PublishChanges这条命令里EnvironmentName是目标环境的标识SolutionFilePath指向解决方案包PublishChanges表示导入完成后把未发布的定制一并发布。不写这个参数的话导入后很多界面变化不会立即生效还要手动再发布一次。具体环境标识可以在 admin center 里查到命令参数是 Power Platform 管理命令行常见的约定换到别的环境只要改EnvironmentName一个地方。导入成功后从解决方案列表里找到 RibbonWorkbench打开其中的自定义页面就能看到可视化编辑器了。这个入口只有在导入完成后才出现因为工具本身的页面也是作为 WebResources 打包在这个解决方案里的这一点很多第一次用的人没意识到还以为装完直接就有图标。4. 按钮与命令栏定制实操参数怎么设、脚本怎么写4.1 在 RibbonWorkbench 里建按钮跟着区域走打开 RibbonWorkbench 之后左边是实体列表右边是命令栏预览。选一个实体比如 Account再选要放置按钮的区域——主表单、子网格、列表。然后通过添加按钮的操作填写 Id、标签、图标、命令等字段。这里需要理解一件事每个按钮最终都要落到三层结构里。第一层是按钮本身Button第二层是命令CommandDefinition第三层是命令里的动作Actions。RibbonWorkbench 把这三层拆成了三个编辑面板你在界面上分开填最后它会汇成 customizations.xml 里的一段结构。实际操作中比较容易被忽略的是区域选择。同一个按钮放到主表单区域和子网格区域Location 完全不一样前者出现在单条记录的顶部工具栏后者出现在列表或关联记录网格的工具栏。如果你在一个实体上同时想要两处入口就得建两个按钮分别指向各自的区域并各自绑定命令。刚开始用工具的人常常只在主表单区域加了按钮回过头来问为什么列表里看不到其实就是区域没选全。4.2 WebResources 在按钮脚本里的挂载方式按钮的外观只是一半另一半是点击之后的动作。最常见的动作是调用 JavaScript。脚本本身放在 WebResources 里按钮命令通过 JavaScriptFunction 引用它。下面这个例子是我在项目里最常用的一段按钮脚本骨架。function onCustomButtonClick(primaryControl) { var formContext primaryControl; if (!formContext || !formContext.getAttribute) { return; } var name formContext.getAttribute(name).getValue(); if (name) { Xrm.Navigation.openAlertDialog({ text: 当前记录: name }); } }这是一个最典型的按钮脚本示例。primaryControl 是命令执行时平台传入的上下文参数拿它就能得到当前表单上下文。formContext.getAttribute(name)读取当前记录的 name 字段getValue()取出值最后用Xrm.Navigation.openAlertDialog弹出提示。写这类脚本时注意先判空——按钮可能被挂到子网格子网格场景下 primaryControl 的行为和表单场景不完全一样直接调用表单方法会报错。把这段脚本打包成 WebResource 时唯一名和路径要严格对应。比如你的 WebResource 唯一名是new_ribbon_helper.js那在 XML 里引用就是$WebResource:new_ribbon_helper.js。拼错任何一个字符都会导致按钮点击无响应而这类错误在编译阶段根本查不出来只有运行到点击动作时才会暴露。注意WebResource 的名字不允许有空格和大写字母发布到生产环境前先检查一次命名能省掉不少现场排错时间。4.3 常用参数与调试手段别让黑匣子黑到底调试命令栏按钮很多人觉得像个黑匣子其实有固定套路。先看浏览器控制台任何 JavaScript 报错都会显示在 console 里再刷新页面看按钮状态灰色多半是 EnableRules 或 DisplayRules 没满足点下去没反应优先怀疑命令根本没触发或者脚本没被加载。下面这张参数表是我自己写的排查对照表遇到问题先对着它过一遍再决定要不要动 XML。参数/属性作用常见误用Sequence按钮在区域内排序所有人设 100排序失效EnableRules控制按钮是否可用忘记加规则按钮永久置灰DisplayRules控制按钮是否显示和 EnableRules 混用逻辑冲突Library/FunctionName指定脚本和函数WebResource 路径大小写错误primaryControl当前上下文在子网格中误当成表单上下文参数表里的误用列都是我实际排查过的翻车点。其中 Sequence 最典型多个按钮都默认 100显示顺序就全乱了最后只能按创建顺序猜。所以每次新增按钮我都会把 Sequence 显式设置成一个不跟现有按钮重复的序号宁可空着中间的数字也不要共用。另外调试时还有一个省事小技巧在浏览器里把 RibbonWorkbench 生成的 XML 导出来和之前手动改的版本做一次 diff。这能快速看清工具帮你补了哪些隐藏节点也能在回滚时知道该恢复哪一段。导出操作在工具的解决方案菜单里就有做一次 diff 花不了两分钟却能省掉大半瞎猜的时间。调试完成后记得走发布这一步。命令栏的改动在导入后不会立刻生效需要执行一次发布自定义。在界面上的入口是「发布自定义」PowerShell 里对应的是发布相关的管理命令。发布后立刻清一次浏览器缓存旧版脚本经常因为缓存还在继续跑导致你改了代码却看不到效果。到这里一套从导入到调试的闭环就算走通了。5. 避坑排查导入失败与按钮不显示的五个高频问题5.1 导入时报「解决方案版本低于现有版本」现象导入向导在最后一步弹错提示环境中已存在相同名称的解决方案且版本不低于待导入版本。原因环境里已经装了同名解决方案版本号反而比这个包更高或相同。常见于之前导入过旧包后来想覆盖成这个 managed 包。解决要么先卸载旧解决方案再导入新包要么确认环境里已有的版本确实低于这个包。我一般会先把解决方案列表按 UniqueName 排序找到同名项卸载后再导入。注意卸载会连带删除该解决方案发布到环境里的组件如果有别的定制依赖它卸载前先排查一次依赖关系不要直接点卸载。5.2 按钮在界面上完全不显示现象解决方案导入成功发布也完成了但实体的命令栏里就是看不到新增按钮。原因Location 指定的区域和实体、形态不匹配。比如从工具里选了主表单区域但按钮实际被追加到了子网格区域或者 DisplayRules 里的规则在当前上下文不满足。解决回到 RibbonWorkbench 的编辑界面检查按钮所属区域和 DisplayRules 的取值。还有一种隐蔽情况是区域块标识写错了比如Mscrm.SubGrid.account.MainTab.Management._children里的实体名 account 与实际架构名大小写不一致。架构名要用小写这是这么多年最容易漏点的地方。5.3 点击按钮提示「函数未定义」或控制台报 script error现象按钮正常显示点击却没有任何反应控制台报出类似xxx is not defined的错误。原因命令的 Actions 里引用的 JavaScriptFunction 路径和 WebResource 实际名字不匹配最常见的是大小写错误或少了$WebResource:前缀。另一个高频原因是脚本已发布但浏览器缓存里还是旧版本。解决先到解决方案的 WebResources 列表里核对唯一名再去命令定义里比对 Library 字符串。如果没问题清一次缓存或用隐私模式窗口重新打开页面测试。脚本里有语法错误时RibbonWorkbench 提供的预览功能捕获不到必须在浏览器 console 里看第一条报错指向哪个文件。5.4 回滚失败managed 包删不掉单个自定义现象想要撤掉某个按钮用工具删除后发布但按钮还在想进环境里直接删组件发现组件处于托管状态删不掉。原因managed 解决方案的组件是只读的工具里的删除操作在 managed 环境下只能追加新的定制去掩盖原组件无法物理删除被托管锁定的定义。这是很多第一次接触 managed 部署的人最想不通的地方。解决如果只是临时隐藏按钮给原按钮加一条 DisplayRules 返回 false 即可如果确实要彻底移除得把整个 managed 解决方案卸载再重新导入一个不含该按钮的版本。也就是说在 managed 环境里你的回滚点不是单个组件而是整个解决方案包。基于这个原因我强烈建议每发布一个版本就把原始 zip 存好它就是你唯一的后悔药。5.5 zip 解压失败或导入时提示文件类型无效现象解压时报密码错误、文件头损坏或者导入时提示[Content_Types].xml缺失、文件扩展名无法识别。原因这一条大概率不是包本身的问题而是文件在传输过程中被转存过。zip 伪加密让解压工具误以为有密码或者文件在下载时被浏览器改成了.zip.txt之类的名字导入时系统识别不了。直接重命名再导入就能解决但如果是伪加密需要先去掉标记位用 7-Zip 打开并重新保存一份通常就能恢复正常。解决养成导入前先跑一遍unzip -t的习惯校验通过再上环境能避开大半导入类问题。假如你手里的包是别人二次打包的顺手看看压缩包内第一层文件列表确认 solution.xml 和 [Content_Types].xml 都直接在这个根目录下而不是嵌套了一层同名文件夹。嵌套一层听着不起眼导入工具却会直接报「文件不存在」。6. 进阶技巧批量部署与版本回滚的后悔药到这一步基础操作和排错都说完了再说一个我实际工作里最受益的习惯把部署和回滚做成脚本。如果你要往开发、测试、生产三套环境推同一个 RibbonWorkbench 解决方案手动点三次导入既慢又容易漏写成脚本循环是最稳妥的。$envs (env-dev, env-test, env-prod) $solutionPath C:\packages\RibbonWorkbench2016_3_1_443_1_managed.zip foreach ($env in $envs) { Write-Host Importing to $env ... Import-PowerAppsSolution -EnvironmentName $env -SolutionFilePath $solutionPath -PublishChanges }这个循环本身没有什么技术含量价值在于它强制你把环境清单和包路径固化下来。每跑一次这三个环境里的解决方案版本就保持一致不会出现测试环境修好了、生产环境还在跑旧包的情况。脚本跑完再逐个环境登录进去用前面说的导出 XML 做 diff确认按钮区域和脚本引用没有偏差。然后是回滚。对 managed 解决方案来说真正的后悔药只有两样导入前保存好的原始 zip和导入时记录下的版本号。我踩过一次最深的坑就是没有保存上一个版本的包新版本导入后发现按钮规则有问题想回滚却找不到旧包最后只能靠手工还原 XML一边改一边担心漏掉节点。从那以后每次导入前我都会把当前环境里已有的解决方案版本号导出留底原始 zip 按日期归档等新版本稳定跑满一个迭代周期再清理。这套习惯救了我好几次每次现场出问题时都有路可退。如果你也在做 Dynamics 365 和 Power Apps 的命令栏定制不妨先把这套流程跑通再研究更深入的功能。希望帮到你。本文还有配套的精品资源点击获取
返回列表