# 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 版本