# serverless-tencent-plugin > ticket: https://app.asana.com/0/1200011502754281/1200912596168520/f > repo: ## Need to achieve in plugin ### Commands - [x] init - [x] auto - [x] Deploy - [x] Remove - [x] Invoke - [x] Invoke local - [x] Logs - [x] credentials - [x] dev - [x] info - [x] registry: get all registied components - [x] publish: publish component - [x] help - [x] version - [x] custom command #### commands map to users ```json= `users action in terminal`: `command in plugin` { "init": "init", "deploy": "deploy", "remove": "remove", "invoke": "invoke", "invoke local": "invoke local", "logs": "logs", "credentials set": "credentials set, "credentials list": "credentials list", "credentials remove": "credentials remove", "dev": "dev", "info": "info", "registry": "registry",(find all components) "publish": "publish", "registry xxxx": "registry", (find a specific component) "help": "help", "version": "version", "the interactive cli": "auto", (user init a project interactively) "any other commands not included above": "custom", } ``` ### Base Feature - [ ] help - [ ] 完全复写framework CLI help 命令。 - [ ] 全局接管CLI命令,不管在什么目录都可以使用plugin接管命令。 - [ ] CLI Events,停掉framework CLI的event, 使用plguin 自身的events. ### validation - [ ] dotEnv check comments 注释错误检查。 - [ ] type checker yml 配置教研 - [ ] warning checker 【重要程度不高】 ### Other - [ ] Auto Installsation - [ ] aws plugin, - [ ] ** (高优先级) 执行命令 sls xxx -> 检查语言地区 -> 自动安装plugin (初始中...)-> 显示中文命令 - [ ] Auto update - [ ] (高优先级),npm update 升级的 framework CLI。 - [ ] ** sls update, (升级plguin) - [ ] 执行命令之后,检查plugin 版本询问用户是否升级 (除 deploy 命令之外) - [ ] 公共utils 库,是否可以调用framework CLI的公共库,是否全部需要重写。 - [ ] https://github.com/serverless/components/blob/master/src/cli/utils.js - [ ] ** 调用 serverless CLI 命令方式。 - [ ] 启动和关闭plugin的方式。 - [ ] ** serverless CLI 功能。 - [ ] 更改 framework CLI 的配置来关闭加载 plugin。 sls plugins xxxxxxxxx - [ ] serverless-tencnet : ## Todo 1. `Framework cli` 自带的一些command 无法在 插件中定义使用(`help, invoke ...`), 会优执行自带的命令 https://serverless.com/framework/docs/providers/aws/guide/plugins#command-naming 2. `Framework cli`不兼容 `component cli` 的yml 3. CLI 需要统一处理 `自定义命令` 为单一command 4. 在使用插件进行开发之后, 如何进行本地测试和进行canary 测试, 对于 `components cli` 我们有现成的canary版本可以给其他人测试 ## Plugin 安装和运行流程 ### 安装 1. [init configs](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/scripts/serverless.js#L557) 2. [load plugins](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/Serverless.js#L211): `this.service.plugins` param is the plugins we used in `yml` file 3. [load All plugins](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/classes/PluginManager.js#L148) 1. [load built-in plugins](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/classes/PluginManager.js#L152) 2. [load external plugins](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/classes/PluginManager.js#L157): [resolveServicePlugins](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/classes/PluginManager.js#L166) will resolve external plugins from local and **node_modules** 4. [async init](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/classes/PluginManager.js#L163): if plugin has `async init`, will call it ### 执行 1. [start to run](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/scripts/serverless.js#L803) 2. [run in plugin](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/Serverless.js#L457) 3. [invoke command](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/classes/PluginManager.js#L640) 4. [invoke hook defined in plugin](https://github.com/serverless/serverless/blob/6087fa3400b508092a5113d40e4b2c4fd8ec22a7/lib/classes/PluginManager.js#L580) ## serverless-tencent-plugin 使用和开发 1. 当前framework cli 没有自动集成此插件,所以需要使用 npm install的方法安装使用 2. 当前cli没有把所有的命令托管在 plugin中,所以一些命令无法使用`help, invoke, logs` #### 前置条件 因为现在 framework cli 还没有集成和适配我们的插件和需求,所以需要: 1. clone **serverless cli**: `git clone git@github.com:serverless/serverless.git` 2. 修改 `bin/serverless.js`, 把第 52行代码: `return () => require('../scripts/serverless');`, 替换到 35 行下面,这样强行让cli完全运行 `framework cli` 的代码,而不使用 `components cli` 代码 3. 使用 `bin/serverless.js` 代替下面的 `sls` 命令 #### 插件本地开发和测试 1. clone 项目到本地: `git clone git@github.com:serverless/serverless-tencent.git` 2. 修改 `package.json/main` 字段为 `./src/index.js` 3. 在自己当前任意项目的 `serverless.yml` 中添加 ```yaml= plugins: - "../../serverless-tencent" # serverless-tencent 在你本机的地址 service: 'xxx' # 任意内容,这里是为了通过cli的文件字段校验 provider: name: 'xxx' # 任意内容,这里是为了通过cli的文件字段校验 ``` 4. 执行命令,例如: `sls deploy` #### canary 测试 1. `npm install @serverless/serverless-tencent-plugin@canary` 2. 修改 `serverless.yml`: ```yaml= plugins: - "@serverless/serverless-tencent-plugin" # cli将来实现自动安装并且集成此插件之后,就不需要再配置此字段 service: 'xxx' # 任意内容,这里是为了通过cli的文件字段校验 provider: name: 'xxx' # 任意内容,这里是为了通过cli的文件字段校验 ``` 3. 执行命令,例如: `sls deploy` #### stable 测试 1. `npm install @serverless/serverless-tencent-plugin` 2. 修改 `serverless.yml`: ```yaml= plugins: - "@serverless/serverless-tencent-plugin" # cli将来实现自动安装并且集成此插件之后,就不需要再配置此字段 service: 'xxx' # 任意内容,这里是为了通过cli的文件字段校验 provider: name: 'xxx' # 任意内容,这里是为了通过cli的文件字段校验 ``` 3. 执行命令,例如: `sls deploy` #### 发布流程 ##### canary 发布 1. 提交、合并代码到 **master** 分支, 不更改 `package.json/version` 字段,自动发布 canary ##### stable 发布 1. 功能开发完成之后, 更改 `package.json/version`, 并且 更新 `CHANGELOG.md` 2. 提交,合并代码到 **master** 分支,自动发布 stable 版本