1 | # dpro 插件开发
|
2 |
|
3 | `dpro` 开放了自定义开发插件能力,让开发者 `1s` 钟开发出自己的插件,提高生产效率,成为 钉钉闪电侠⚡️。开发者可以一起完善整个工具的插件生态。<br />由于需要支持 `dpro` 的开发链路调试,初始化插件脚手架的时候系统默认会以 `-D` 的模式,在插件目录运行安装 `dingtalk-cli-pro` 包,但发布插件的 `package.json` 没有依赖。
|
4 |
|
5 |
|
6 | ## 开发插件
|
7 | ```dart
|
8 | # 安装工具
|
9 | $ yarn global add dingtalk-cli-pro # 或者 tnpm install -g dingtalk-cli-pro
|
10 | # 安装插件
|
11 | $ dpro g ## 可交互命令行,按步骤操作
|
12 | # 开发插件
|
13 | $ vi index.js
|
14 | ```
|
15 |
|
16 |
|
17 | ### 使用案例
|
18 | ![](https://intranetproxy.alipay.com/skylark/lark/0/2019/gif/40822/1565585291000-d1a9649a-21ba-465f-b7fd-404493c7feef.gif#align=left&display=inline&height=442&originHeight=442&originWidth=654&size=0&status=done&width=654)
|
19 |
|
20 |
|
21 | ### 插件目录
|
22 | `index.js` 为插件主入口, `dingtalkrc.js` 为调试配置文件,可以通过此配置文件,加载当前插件。
|
23 | ```javascript
|
24 | ├── LICENSE.md
|
25 | ├── babel.config.js
|
26 | ├── dingtalkrc.js
|
27 | ├── index.js
|
28 | ├── jest.config.js
|
29 | ├── package.json
|
30 | ├── readme.md
|
31 | └── test
|
32 | └── index.test.js
|
33 | ```
|
34 |
|
35 |
|
36 | ### 代码案例
|
37 | 对于多个异步操作,插件开发同时支持 `async await` 方式,只需要把 `action(() => {})` 改写成 `action(async () => {})` 即可。
|
38 |
|
39 | ```javascript
|
40 | module.exports = function(dingtalk) {
|
41 | /**
|
42 | * 命令行工具
|
43 | * @see https://www.npmjs.com/package/commander
|
44 | */
|
45 | // 可以使用 dingtalk or this 作用域
|
46 | dingtalk
|
47 | // 注册插件命令 $ dpro helloworld
|
48 | .registryCommand('helloworld')
|
49 | // 插件命令描述
|
50 | .description('welcome to dpro')
|
51 | // 运行命令回调
|
52 | .action(() => {
|
53 | this.log.warn(`Hi ${this.getGitUserInfo().username}, Welcome to dpro`);
|
54 | });
|
55 | }
|
56 | ```
|
57 |
|
58 |
|
59 | ## 脚手架插件开发
|
60 |
|
61 | ### 生命周期
|
62 | ```
|
63 | configuring -> writing -> install -> end
|
64 | ```
|
65 |
|
66 | - configuring: 配置基础信息,配置模板地址(origin), 生成脚手架模板地址(target)
|
67 | - writing: 拷贝文件以及模板文件
|
68 | - install: 安装依赖
|
69 | - end: 结束脚手架,可以使用 `spawnCommand` 脚本开启项目工程
|
70 |
|
71 | ## 调试插件
|
72 | 通过 `dingtalkrc.js` 文件配置当前插件入口文件,数组形式可以加载多个插件,配置如下
|
73 | ```javascript
|
74 | module.exports = {
|
75 | "plugins": [
|
76 | [
|
77 | "./index.js"
|
78 | ]
|
79 | ]
|
80 | }
|
81 | ```
|
82 |
|
83 |
|
84 | ### 运行命令调试
|
85 | ```dart
|
86 | $ dpro command # 命令
|
87 | ```
|
88 |
|
89 |
|
90 | ### vscode调试
|
91 | 插件的开发调试支持VSCode调试, `dpro g ` 命令生成脚手架的时候预制了 `Plugin Param Test` 和 `Plugin Jest Test` 两种命令,可以运行 Vscode 的 debug 模式查看运行。
|
92 |
|
93 | - Plugin Param Test: 可以在Vscode 的 Debug 模式下设置断点
|
94 | - Plugin Jest Test: 可以跑 Jest 的测试用例
|
95 |
|
96 |
|
97 | ## 发布插件
|
98 | 发布插件需要删除或者更改 `dingtalkrc.js` 文件,例如可以更改文件为 `dingtalk.prod.js` , 通过 `tnpm` 或者 `npm` 方式发布。
|
99 | ```dart
|
100 | # 阿里内部插件
|
101 | $ tnpm publish
|
102 | # 公网使用插件
|
103 | $ npm publish
|
104 | ```
|
105 |
|
106 |
|
107 | ## API 接口
|
108 |
|
109 | ### 1. 文件模块
|
110 | `dintalk.fs|this.fs`上下文对象, [Mem-fs-editor API参考文档](https://www.npmjs.com/package/mem-fs-editor)
|
111 |
|
112 | ### 2. 命令行模块
|
113 | `dingtalk.registryCommand|this.registryCommand`上下文对象, [Commander API 参考文档](https://www.npmjs.com/package/commander)
|
114 |
|
115 | ### 3. 可交互模块
|
116 | `dingtalk.prompt|this.prompt`上下文对象, [Inquirer API 参考文档](https://www.npmjs.com/package/inquirer)
|
117 |
|
118 | ### 4. 日志模块
|
119 | `dingtalk.log|this.log`上下文对象, [Log API 参考文档](https://yuque.antfin-inc.com/dingcontent/on7glz/ngtz5w/lib/log.js)
|
120 |
|
121 | ##
|
122 |
|
123 | ## 常用插件列表
|
124 |
|
125 | ### 1. 静态服务器
|
126 | ```
|
127 | $ tnpm i dingtalk-plugin-serve -g
|
128 | ```
|
129 |
|