Skip to content
This repository was archived by the owner on May 6, 2025. It is now read-only.

Commit febf16b

Browse files
committed
feat: support env domains & update doc
1 parent 26e4a8f commit febf16b

17 files changed

Lines changed: 610 additions & 39 deletions

File tree

README.md

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ npm install -g @cloudbase/cli
1212

1313
### 1. 初始化
1414

15+
使用 `tcb init` 创建项目,创建项目时 CLI 工具会成一个 Node 函数模板,供使用参考。
16+
1517
```shell
1618
# 此命令会创建一个目录,并写入配置
1719
tcb init
@@ -34,9 +36,9 @@ TCB 项目文件结构:
3436

3537
### 2. 编写函数
3638

37-
为了规范使用,所有函数都统一存放在 `functions` 目录下,并以函数名作为文件夹名称`tcb init` 创建项目时默认会成 Node 函数模板,供使用参考
39+
为了规范使用,所有 Node 和 PHP 函数都统一存放在 `functions` 目录下,并以函数名作为文件夹名称,如 `functions/tcb/index.js`**对于 Java 函数时,则需要将 jar 文件名修改为函数名称,放在 `functions` 目录下即可,如 `functions/tcb.jar`**
3840

39-
例如,创建一个 app 函数,下面是 `functions/app/index.js` 的内容
41+
例如,创建一个 Node.js 函数 app,下面是 `functions/app/index.js` 的内容
4042

4143
```js
4244
'use strict'
@@ -127,33 +129,35 @@ exports.main = (event, context, callback) => {
127129
"config": "0 0 2 1 * * *"
128130
}
129131
],
130-
// 触发云函数时的函数参数
131-
"params": {},
132132
// 函数处理入口,Node 和 PHP 项目可以省略,默认值为 index.main
133133
// 因 Java 的 handler 配置较为特殊,所以当运行时为 Java 时,handler 不能省略
134134
// 如:package.Class::mainHandler
135-
"handler": "index.main"
135+
"handler": "index.main",
136+
// functions:invoke 本地触发云函数时的调用参数
137+
"params": {},
136138
}
137139
]
138140
}
139141
```
140142

141143
### 4. 部署函数
142144

143-
最后,在项目根目录下运行下面的命令,即可部署 app 函数到云端
145+
最后,在项目根目录下(tcbrc.json 所在目录)运行 `tcb functions:deploy` 命令,即可部署 app 函数到云端
144146

145-
```
147+
```shell
146148
tcb functions:deploy app
147149
```
148150

149151
## 所有命令
150152

153+
使用 `tcb -h` 查看所有可用命令
154+
151155
```bash
152156
tcb -h
153157
```
154158

155159
```
156-
Usage: [options] [command]
160+
Usage: tcb [options] [command]
157161
158162
Options:
159163
-V, --version output the version number
@@ -164,8 +168,12 @@ Commands:
164168
login [options] 登录腾讯云账号
165169
logout 登出腾讯云账号
166170
env:list 列出云开发所有环境
167-
env:create <alias> <envId> 创建新的云环境
171+
env:create <alias> 创建新的云环境
172+
env:domain:list [envId] 列出环境的安全域名列表
173+
env:domain:create <domain> [envId] 添加环境安全域名,多个以斜杠 / 分隔
174+
env:domain:delete [envId] 删除环境的安全域名
168175
functions:deploy [options] [functionName] [envId] 创建云函数
176+
functions:code:update <functionName> [envId] 创建云函数
169177
functions:list [options] [envId] 展示云函数列表
170178
functions:delete [functionName] [envId] 删除云函数
171179
functions:detail [functionName] [envId] 获取云函数信息
@@ -220,6 +228,12 @@ tcb login --key
220228

221229
`tcb logout` 注销登录
222230

231+
### new
232+
233+
`tcb new` 创建一个包含配置文件 `tcbrc.json` 的云开发项目
234+
235+
![](docs/img/new.png)
236+
223237
### env:list
224238

225239
`tcb env:list` 列出所有的云开发环境
@@ -240,11 +254,23 @@ tcb login --key
240254

241255
`env:create` 命令创建一个新的云开发环境,需要制定环境的别名 `alias`
242256

243-
### new
257+
### env:domain:list
244258

245-
`tcb new` 创建一个包含配置文件 `tcbrc.json` 的云开发项目
259+
完整命令 `tcb env:domain:list [envId]`
246260

247-
![](docs/img/new.png)
261+
`env:domain:list` 命令列出环境配置所有的安全域名。
262+
263+
### env:domian:create
264+
265+
完整命令:`tcb env:domain:create <domain> [envId]`
266+
267+
`env:domain:create` 命令用于添加域名到指定的环境,当需要添加多个域名时,需要以 `/` 分隔,如 `abc.com/def.com`
268+
269+
### env:domain:delete
270+
271+
完整命令:`tcb env:domain:delete [envId]`
272+
273+
`env:domain:delete` 命令用于删除环境配置的安全域名,输入此命令回车运行后,CLI 会拉取环境的所有域名,用户可与 CLI 进行交互,选择需要删除的域名。
248274

249275
### functions:list
250276

@@ -285,13 +311,17 @@ tcb functions:list -l 10
285311

286312
> **注意** `functions:deploy` 命令必须在包含 `tcbrc.json` 配置文件的项目根目录下执行。
287313
288-
`functions:deploy` 会根据 `tcbrc.json` 配置文件部署云函数,`functions:deploy` 命令的参数包含一些可选的选项 options 和可选的函数名称 `functionName`,以及可选的环境 Id `envId`
314+
`functions:deploy` 会根据 `tcbrc.json` 配置文件部署云函数,`functions:deploy` 命令的参数包含一些可选的选项 options 和可选的函数名称 `functionName` 以及环境 Id `envId`
289315

290-
**`functions:list` 类似,环境 Id 可以列出在命令中,也可以缺省,CLI 会从 `tcbrc.json` 文件中读取。(下文不做再次说明)**
316+
`functions:deploy` 命令会完成以下几项工作:
317+
318+
1. 上传函数代码。
319+
2. 部署函数配置,包括超时时间、网络配置等。
320+
3. 部署函数触发器。
291321

292-
使用 `functions:list` 时,`functionName` 选项是可以省略的。
322+
** `functions:list` 类似,环境 Id 可以列出在命令中,也可以缺省,CLI 会从 `tcbrc.json` 文件中读取。(下文不做再次说明)**
293323

294-
`functionName` 省略时,CLI 会部署配置文件中的全部函数
324+
使用 `functions:deploy` 时,`functionName` 选项是可以省略的,`functionName` 省略时,CLI 会部署配置文件中的全部函数
295325

296326
```shell
297327
tcb functions:deploy
@@ -321,6 +351,14 @@ tcb functions:deploy --force
321351
tcb functions:deploy dev --force
322352
```
323353

354+
### functions:code:update
355+
356+
完整命令:`tcb functions:code:update <functionName> [envId]`
357+
358+
`functions:code:update` 命令用于更新的函数的代码以及函数的执行入口,除此之外 `functions:code:update` 命令不会修改函数的其他配置。
359+
360+
`functions:code:update` 命令和 `functions:deploy` 命令的主要区别是 `functions:code:update` 命令只会更新函数的代码以及执行入口,不会修改函数的其他配置,而 `functions:deploy` 命令则会修改函数的代码以及所有配置。
361+
324362
### functions:invoke
325363

326364
完整命令:`tcb functions:invoke [functionName] [params] [envId]`

docs/api.md

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,69 @@ client
4040

4141
参数:
4242

43-
```
43+
```js
4444
{
4545
alias: string
4646
}
4747
```
4848

4949
响应:void
5050

51+
52+
#### env.domain.list(options)
53+
54+
参数:
55+
56+
```js
57+
{
58+
envId: string
59+
}
60+
```
61+
62+
响应:
63+
64+
```js
65+
[
66+
{
67+
Id: 'f8f7786b-cbba-4c0e-ba7e-a4139a99401d',
68+
Domain: 'abc.com',
69+
Status: 'ENABLE',
70+
CreateTime: '2019-08-15 17:39:39',
71+
UpdateTime: '2019-08-15 17:39:39'
72+
}
73+
]
74+
```
75+
76+
#### env.domains.create(options)
77+
78+
参数:
79+
80+
```js
81+
{
82+
envId: string,
83+
domains: string[]
84+
}
85+
```
86+
87+
响应:void
88+
89+
#### env.domains.delete(options)
90+
91+
```js
92+
{
93+
envId: string,
94+
// 域名 Id 列表
95+
domainIds: string[]
96+
}
97+
```
98+
99+
响应:
100+
101+
```js
102+
// 删除成功数量
103+
deleted: number
104+
```
105+
51106
#### functions.invoke(options)
52107

53108
参数:

lib/commands/env-domain.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
"use strict";
2+
var __importDefault = (this && this.__importDefault) || function (mod) {
3+
return (mod && mod.__esModule) ? mod : { "default": mod };
4+
};
5+
Object.defineProperty(exports, "__esModule", { value: true });
6+
const commander_1 = __importDefault(require("commander"));
7+
const ora_1 = __importDefault(require("ora"));
8+
const inquirer_1 = __importDefault(require("inquirer"));
9+
const utils_1 = require("../utils");
10+
const error_1 = require("../error");
11+
const logger_1 = require("../logger");
12+
const env_1 = require("../env");
13+
commander_1.default
14+
.command('env:domain:list [envId]')
15+
.description('列出环境的安全域名列表')
16+
.action(async function (envId) {
17+
const assignEnvId = await utils_1.getEnvId(envId);
18+
const domains = await env_1.getEnvAuthDomains({
19+
envId: assignEnvId
20+
});
21+
if (domains.length === 0) {
22+
console.log('安全域名为空!');
23+
return;
24+
}
25+
const head = ['Domain Id', 'Domain', 'CreateTime', 'Status'];
26+
const tableData = domains.map(item => [
27+
item.Id,
28+
item.Domain,
29+
item.CreateTime,
30+
item.Status === 'ENABLE' ? '启用中' : '禁用中'
31+
]);
32+
utils_1.printCliTable(head, tableData);
33+
});
34+
commander_1.default
35+
.command('env:domain:create <domain> [envId]')
36+
.description('添加环境安全域名,多个以斜杠 / 分隔')
37+
.action(async function (domain, envId) {
38+
const assignEnvId = await utils_1.getEnvId(envId);
39+
const domains = domain.split('/');
40+
const { confirm } = await inquirer_1.default.prompt({
41+
type: 'confirm',
42+
name: 'confirm',
43+
message: `确认添加以下安全域名: ${domains} ?`,
44+
default: true
45+
});
46+
if (!confirm) {
47+
throw new error_1.TcbError('操作终止!');
48+
}
49+
let envDomains = await env_1.getEnvAuthDomains({
50+
envId: assignEnvId
51+
});
52+
envDomains = envDomains.map(item => item.Domain);
53+
const exitDomains = [];
54+
domains.forEach(item => {
55+
if (envDomains.includes(item)) {
56+
exitDomains.push(item);
57+
}
58+
});
59+
if (exitDomains.length) {
60+
throw new error_1.TcbError(`域名 [${exitDomains.join(', ')}] 已存在!`);
61+
}
62+
await env_1.createEnvDomain({
63+
envId: assignEnvId,
64+
domains: domains
65+
});
66+
logger_1.successLog('添加安全域名成功!');
67+
});
68+
commander_1.default
69+
.command('env:domain:delete [envId]')
70+
.description('删除环境的安全域名')
71+
.action(async function (envId) {
72+
const assignEnvId = await utils_1.getEnvId(envId);
73+
const loadSpinner = ora_1.default('拉取环境安全域名中...').start();
74+
const domains = await env_1.getEnvAuthDomains({
75+
envId: assignEnvId
76+
});
77+
if (domains.length === 0) {
78+
loadSpinner.fail('域名安全为空!');
79+
return;
80+
}
81+
loadSpinner.succeed('拉取环境安全域名成功!');
82+
const domainList = domains.map(item => item.Domain);
83+
const { selectDomains } = await inquirer_1.default.prompt({
84+
type: 'checkbox',
85+
name: 'selectDomains',
86+
message: '请选择需要删除的域名(可多选)>',
87+
choices: domainList,
88+
default: true
89+
});
90+
const { confirm } = await inquirer_1.default.prompt({
91+
type: 'confirm',
92+
name: 'confirm',
93+
message: `确认删除以下安全域名: ${selectDomains} ?`,
94+
default: true
95+
});
96+
if (!confirm) {
97+
throw new error_1.TcbError('操作终止!');
98+
}
99+
const domainIds = domains
100+
.filter(item => selectDomains.includes(item.Domain))
101+
.map(item => item.Id);
102+
const deleted = await env_1.deleteEnvDomain({
103+
domainIds,
104+
envId: assignEnvId,
105+
});
106+
logger_1.successLog(`成功删除了 ${deleted} 个域名!`);
107+
});

0 commit comments

Comments
 (0)