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

Commit 4351023

Browse files
committed
feat: support custom config file
1 parent 492033f commit 4351023

73 files changed

Lines changed: 2168 additions & 95 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bin/cloudbase.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,21 @@ notifier.notify({
2626
// 注册命令
2727
require('../lib')
2828

29-
program.version(pkg.version)
29+
program.option(
30+
'--config-file <path>',
31+
'设置配置文件,默认为 ./cloudbaserc.js 或 .cloudbaserc.json'
32+
)
33+
34+
program.version(pkg.version, '-V, --version', '输出当前 CloudBase CLI 版本')
3035

3136
// 处理无效命令
3237
program.action(cmd => {
3338
console.log(chalk.bold.red('Error: ') + `${cmd} 不是有效的命令!`)
3439
console.log(`使用 ${chalk.bold('cloudbase -h')} 查看所有命令~`)
3540
})
3641

42+
// 修改 help 提示信息
43+
program._helpDescription = '输出帮助信息'
3744
program.on('--help', function() {
3845
const tips = `\nTips:
3946
Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
66
const commander_1 = __importDefault(require("commander"));
77
const ora_1 = __importDefault(require("ora"));
88
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");
9+
const utils_1 = require("../../utils");
10+
const error_1 = require("../../error");
11+
const logger_1 = require("../../logger");
12+
const env_1 = require("../../env");
1313
commander_1.default
1414
.command('env:domain:list [envId]')
1515
.description('列出环境的安全域名列表')
16-
.action(async function (envId) {
17-
const assignEnvId = await utils_1.getEnvId(envId);
16+
.action(async function (envId, options) {
17+
const { configFile } = options.parent;
18+
const assignEnvId = await utils_1.getEnvId(envId, configFile);
1819
const domains = await env_1.getEnvAuthDomains({
1920
envId: assignEnvId
2021
});
@@ -34,8 +35,9 @@ commander_1.default
3435
commander_1.default
3536
.command('env:domain:create <domain> [envId]')
3637
.description('添加环境安全域名,多个以斜杠 / 分隔')
37-
.action(async function (domain, envId) {
38-
const assignEnvId = await utils_1.getEnvId(envId);
38+
.action(async function (domain, envId, options) {
39+
const { configFile } = options.parent;
40+
const assignEnvId = await utils_1.getEnvId(envId, configFile);
3941
const domains = domain.split('/');
4042
const { confirm } = await inquirer_1.default.prompt({
4143
type: 'confirm',
@@ -68,8 +70,9 @@ commander_1.default
6870
commander_1.default
6971
.command('env:domain:delete [envId]')
7072
.description('删除环境的安全域名')
71-
.action(async function (envId) {
72-
const assignEnvId = await utils_1.getEnvId(envId);
73+
.action(async function (envId, options) {
74+
const { configFile } = options.parent;
75+
const assignEnvId = await utils_1.getEnvId(envId, configFile);
7376
const loadSpinner = ora_1.default('拉取环境安全域名中...').start();
7477
const domains = await env_1.getEnvAuthDomains({
7578
envId: assignEnvId
@@ -101,7 +104,7 @@ commander_1.default
101104
.map(item => item.Id);
102105
const deleted = await env_1.deleteEnvDomain({
103106
domainIds,
104-
envId: assignEnvId,
107+
envId: assignEnvId
105108
});
106109
logger_1.successLog(`成功删除了 ${deleted} 个域名!`);
107110
});

lib/commands/env/index.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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 env_1 = require("../../env");
9+
const utils_1 = require("../../utils");
10+
const error_1 = require("../../error");
11+
const logger_1 = require("../../logger");
12+
require("./domain");
13+
require("./login");
14+
commander_1.default
15+
.command('env:list')
16+
.description('列出云开发所有环境')
17+
.action(async function () {
18+
const data = await env_1.listEnvs();
19+
const head = [
20+
'EnvId',
21+
'Alias',
22+
'PackageName',
23+
'Source',
24+
'CreateTime',
25+
'Status'
26+
];
27+
const tableData = data.map(item => [
28+
item.EnvId,
29+
item.Alias,
30+
item.PackageName,
31+
item.Source === 'miniapp' ? '小程序' : '云开发',
32+
item.CreateTime,
33+
item.Status === 'NORMAL' ? '正常' : '不可用'
34+
]);
35+
utils_1.printCliTable(head, tableData);
36+
const unavalibleEnv = data.find(item => item.Status === 'UNAVAILABLE');
37+
if (unavalibleEnv) {
38+
logger_1.warnLog(`您的环境中存在不可用的环境:[${unavalibleEnv.EnvId}],请留意!`);
39+
}
40+
});
41+
async function checkEnvAvailability(envId) {
42+
const MAX_TRY = 10;
43+
let retry = 0;
44+
return new Promise((resolve, reject) => {
45+
const timer = setInterval(async () => {
46+
const envInfo = await env_1.getEnvInfo(envId);
47+
if (envInfo.Status === 'NORMAL') {
48+
clearInterval(timer);
49+
resolve();
50+
}
51+
else {
52+
retry++;
53+
}
54+
if (retry > MAX_TRY) {
55+
reject(new error_1.CloudBaseError('环境初始化查询超时,请稍后通过 cloudbase env:list 查看环境状态'));
56+
}
57+
}, 1000);
58+
});
59+
}
60+
commander_1.default
61+
.command('env:create <alias>')
62+
.description('创建新的云环境')
63+
.action(async function (alias) {
64+
if (!alias) {
65+
throw new error_1.CloudBaseError('环境名称不能为空!');
66+
}
67+
const res = await env_1.createEnv({
68+
alias
69+
});
70+
if (res.Status === 'NORMAL') {
71+
logger_1.successLog('创建环境成功!');
72+
return;
73+
}
74+
const initSpinner = ora_1.default('环境初始化中...').start();
75+
try {
76+
await checkEnvAvailability(res.EnvId);
77+
initSpinner.succeed('环境初始化成功');
78+
}
79+
catch (e) {
80+
initSpinner.fail(e.message);
81+
}
82+
});
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
55
Object.defineProperty(exports, "__esModule", { value: true });
66
const commander_1 = __importDefault(require("commander"));
77
const inquirer_1 = __importDefault(require("inquirer"));
8-
const utils_1 = require("../utils");
9-
const logger_1 = require("../logger");
10-
const env_1 = require("../env");
8+
const utils_1 = require("../../utils");
9+
const logger_1 = require("../../logger");
10+
const env_1 = require("../../env");
1111
commander_1.default
1212
.command('env:login:list [envId]')
1313
.description('列出环境登录配置')
14-
.action(async function (envId) {
15-
const assignEnvId = await utils_1.getEnvId(envId);
14+
.action(async function (envId, options) {
15+
const { configFile } = options.parent;
16+
const assignEnvId = await utils_1.getEnvId(envId, configFile);
1617
const configList = await env_1.getLoginConfigList({
1718
envId: assignEnvId
1819
});
@@ -34,8 +35,9 @@ commander_1.default
3435
commander_1.default
3536
.command('env:login:config [envId]')
3637
.description('配置环境登录方式')
37-
.action(async function (envId) {
38-
const assignEnvId = await utils_1.getEnvId(envId);
38+
.action(async function (envId, options) {
39+
const { configFile } = options.parent;
40+
const assignEnvId = await utils_1.getEnvId(envId, configFile);
3941
const configList = await env_1.getLoginConfigList({
4042
envId: assignEnvId
4143
});
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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 ora_1 = __importDefault(require("ora"));
7+
const path_1 = __importDefault(require("path"));
8+
const error_1 = require("../../error");
9+
const function_1 = require("../../function");
10+
async function codeUpdate(ctx) {
11+
const { name, envId, config, functions } = ctx;
12+
if (!name) {
13+
throw new error_1.CloudBaseError('请指定函数名称!');
14+
}
15+
const func = functions.find(item => item.name === name);
16+
if (!func || !func.name) {
17+
throw new error_1.CloudBaseError(`函数 ${name} 配置不存在`);
18+
}
19+
const spinner = ora_1.default(`[${func.name}] 函数代码更新中...`).start();
20+
try {
21+
await function_1.updateFunctionCode({
22+
func,
23+
envId,
24+
functionRootPath: path_1.default.join(process.cwd(), config.functionRoot)
25+
});
26+
spinner.succeed(`[${func.name}] 函数代码更新成功!`);
27+
}
28+
catch (e) {
29+
spinner.stop();
30+
throw e;
31+
}
32+
}
33+
exports.codeUpdate = codeUpdate;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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 inquirer_1 = __importDefault(require("inquirer"));
7+
const error_1 = require("../../error");
8+
const function_1 = require("../../function");
9+
const logger_1 = require("../../logger");
10+
async function configUpdate(ctx) {
11+
const { name, envId, functions } = ctx;
12+
let isBathUpdate = false;
13+
if (!name) {
14+
const { isBatch } = await inquirer_1.default.prompt({
15+
type: 'confirm',
16+
name: 'isBatch',
17+
message: '无云函数名称,是否需要更新配置文件中的【全部云函数】的配置?',
18+
default: false
19+
});
20+
isBathUpdate = isBatch;
21+
if (!isBathUpdate) {
22+
throw new error_1.CloudBaseError('请指定云函数名称!');
23+
}
24+
}
25+
if (isBathUpdate) {
26+
await function_1.batchUpdateFunctionConfig({
27+
envId,
28+
functions,
29+
log: true
30+
});
31+
return;
32+
}
33+
const functionItem = functions.find(item => item.name === name);
34+
if (!functionItem) {
35+
throw new error_1.CloudBaseError('未找到相关函数配置,请检查函数名是否正确');
36+
}
37+
await function_1.updateFunctionConfig({
38+
envId,
39+
functionName: name,
40+
config: functionItem.config
41+
});
42+
logger_1.successLog(`[${name}] 更新云函数配置成功!`);
43+
}
44+
exports.configUpdate = configUpdate;

lib/commands/functions/copy.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
const function_1 = require("../../function");
4+
const logger_1 = require("../../logger");
5+
const error_1 = require("../../error");
6+
async function copy(ctx, newFunctionName, targentEnvId, options) {
7+
const { name, envId } = ctx;
8+
const { force } = options;
9+
if (!name || !newFunctionName) {
10+
throw new error_1.CloudBaseError('请指定函数名称!');
11+
}
12+
await function_1.copyFunction({
13+
force,
14+
envId,
15+
newFunctionName,
16+
functionName: name,
17+
targetEnvId: targentEnvId || envId
18+
});
19+
logger_1.successLog('拷贝函数成功');
20+
}
21+
exports.copy = copy;

lib/commands/functions/delete.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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 inquirer_1 = __importDefault(require("inquirer"));
7+
const error_1 = require("../../error");
8+
const function_1 = require("../../function");
9+
const logger_1 = require("../../logger");
10+
async function deleteFunc(ctx) {
11+
const { name, envId, functions } = ctx;
12+
let isBatchDelete = false;
13+
if (!name) {
14+
const answer = await inquirer_1.default.prompt({
15+
type: 'confirm',
16+
name: 'isBatch',
17+
message: '无云函数名称,是否需要删除配置文件中的全部云函数?',
18+
default: false
19+
});
20+
if (answer.isBatch) {
21+
const { reConfirm } = await inquirer_1.default.prompt({
22+
type: 'confirm',
23+
name: 'reConfirm',
24+
message: '确定要删除配置文件中的全部云函数?',
25+
default: false
26+
});
27+
isBatchDelete = reConfirm;
28+
}
29+
if (!isBatchDelete) {
30+
throw new error_1.CloudBaseError('请指定需要删除的云函数名称!');
31+
}
32+
}
33+
if (isBatchDelete) {
34+
const names = functions.map(item => item.name);
35+
return await function_1.batchDeleteFunctions({
36+
names,
37+
envId
38+
});
39+
}
40+
await function_1.deleteFunction({
41+
envId,
42+
functionName: name
43+
});
44+
logger_1.successLog(`删除函数 [${name}] 成功!`);
45+
}
46+
exports.deleteFunc = deleteFunc;

0 commit comments

Comments
 (0)