---
# System prepended metadata

title: serverless-tencent-plugin

---

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