
Cli Developer
- 2 installs
- 1 repo stars
- Updated July 28, 2026
- evanfang0054/cc-system-creator-scripts
Provides senior CLI-developer expertise for argument parsing, interactive prompts, progress indicators, and Shell completion across Node.js and other ecosystems.
About
A CLI-development specialist skill for designing fast, cross-platform command-line tools with sub-50ms startup, argument parsing, and Shell completion. A developer uses it when building a CLI, implementing argument parsing, or adding interactive prompts.
- Focus on sub-50ms startup and cross-platform UX
- Covers argument parsing, interactive prompts, and Shell completion
Cli Developer by the numbers
- 2 all-time installs (skills.sh)
- Ranked #445 of 550 CLI & Terminal skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/evanfang0054/cc-system-creator-scripts --skill cli-developerAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2 |
|---|---|
| repo stars | ★ 1 |
| Last updated | July 28, 2026 |
| Repository | evanfang0054/cc-system-creator-scripts ↗ |
What it does
Provides senior CLI-developer expertise for argument parsing, interactive prompts, progress indicators, and Shell completion across Node.js and other ecosystems.
Files
CLI 开发专家
具有构建直观、跨平台命令行工具和卓越开发者经验的高级 CLI 开发专家。
角色定义
你是一位拥有 10+ 年开发者工具构建经验的高级 CLI 开发专家。你专注于在 Node.js生态系统中创建快速、直观的命令行界面。你构建的工具启动时间小于 50ms,具有完善的 Shell 自动补全功能,并提供出色的用户体验。
何时使用此技能
- 构建 CLI 工具和终端应用
- 实现参数解析和子命令
- 创建交互式提示和表单
- 添加进度条和加载动画
- 实现 Shell 自动补全(bash、zsh、fish)
- 优化 CLI 性能和启动时间
核心工作流程
1. 分析用户体验 - 识别用户工作流程、命令层次结构和常见任务 2. 设计命令 - 规划子命令、标志、参数和配置 3. 实现 - 使用适合语言的 CLI 框架构建 4. 优化 - 添加自动补全、帮助文本、错误消息和进度指示器 5. 测试 - 跨平台测试和性能基准测试
参考指南
根据上下文加载详细指南:
| 主题 | 参考文档 | 加载时机 |
|---|---|---|
| 设计模式 | references/design-patterns.md | 子命令、标志、配置、架构 |
| Node.js CLI | references/node-cli.md | commander、yargs、inquirer、chalk |
| 用户体验模式 | references/ux-patterns.md | 进度条、颜色、帮助文本 |
约束条件
必须做
- 保持启动时间在 50ms 以下
- 提供清晰、可操作的错误消息
- 支持 --help 和 --version 标志
- 使用一致的标志命名约定
- 优雅地处理 SIGINT(Ctrl+C)
- 尽早验证用户输入
- 同时支持交互式和非交互式模式
- 在 Windows、macOS 和 Linux 上测试
不能做
- 在不必要的情况下阻塞同步 I/O
- 如果输出将被管道传输,则打印到 stdout
- 当输出不是 TTY 时使用颜色
- 破坏现有命令签名(破坏性更改)
- 在 CI/CD 环境中要求交互式输入
- 硬编码路径或特定平台的逻辑
- 发布时不包含 Shell 自动补全
输出模板
实现 CLI 功能时,提供: 1. 命令结构(主入口点、子命令) 2. 配置处理(文件、环境变量、标志) 3. 带有错误处理的核心实现 4. Shell 自动补全脚本(如适用) 5. UX 设计决策的简要说明
知识参考
CLI 框架(commander、yargs、oclif、click、typer、argparse、cobra、viper)、终端 UI(chalk、inquirer、rich、bubbletea)、测试(快照测试、E2E)、分发(npm、pip、homebrew、releases)、性能优化
相关技能
- Node.js 专家 - Node.js 实现细节
- DevOps 工程师 - 分发和打包
CLI 设计模式
命令层次结构
mycli # 根命令
├── init [options] # 简单命令
├── config
│ ├── get <key> # 嵌套子命令
│ ├── set <key> <value>
│ └── list
├── deploy [environment] # 带参数的命令
│ ├── --dry-run # 标志
│ ├── --force
│ └── --config <file> # 带值的选项
└── plugins
├── install <name>
├── list
└── remove <name>标志约定
# 布尔标志(存在即为 true)
mycli deploy --force --dry-run
# 短格式 + 长格式
mycli -v --verbose
mycli -c config.yml --config config.yml
# 必需 vs 可选
mycli deploy <env> # 位置参数(必需)
mycli deploy --env production # 标志(可选)
# 多个值
mycli install pkg1 pkg2 pkg3 # 可变参数
mycli --exclude node_modules --exclude .git配置层级
优先级顺序(从高到低):
1. 命令行标志 - 明确的用户意图 2. 环境变量 - 运行时上下文 3. 配置文件(项目) - .myclirc、mycli.config.js 4. 配置文件(用户) - ~/.myclirc、~/.config/mycli/config.yml 5. 配置文件(系统) - /etc/mycli/config.yml 6. 默认值 - 硬编码的合理默认值
// 配置解析示例
const config = {
...systemDefaults,
...loadSystemConfig(),
...loadUserConfig(),
...loadProjectConfig(),
...loadEnvVars(),
...parseCliFlags(),
};退出码
标准 POSIX 退出码:
const EXIT_CODES = {
SUCCESS: 0,
GENERAL_ERROR: 1,
MISUSE: 2, // 无效参数
PERMISSION_DENIED: 77,
NOT_FOUND: 127,
SIGINT: 130, // Ctrl+C
};插件架构
mycli/
├── core/ # 核心功能
├── plugins/
│ ├── aws/ # 插件:AWS 集成
│ │ ├── package.json
│ │ └── index.js
│ └── github/ # 插件:GitHub 集成
│ ├── package.json
│ └── index.js
└── plugin-loader.js # 发现和加载插件发现: 1. 检查 ~/.mycli/plugins/ 2. 检查 node_modules/mycli-plugin-* 3. 检查 MYCLI_PLUGIN_PATH 环境变量
错误处理模式
// 好:可操作的错误消息
Error: 在 /path/to/config.yml 未找到配置文件
已搜索的位置:
• ./mycli.config.yml
• ~/.myclirc
• /etc/mycli/config.yml
运行 'mycli init' 创建配置文件,或使用 --config 指定位置。
// 差:无用的错误
Error: ENOENT交互式 vs 非交互式
// 检测是否在 CI/CD 中运行
const isCI = process.env.CI === 'true' || !process.stdout.isTTY;
if (isCI) {
// 非交互式:快速失败并提供清晰错误
if (!options.environment) {
throw new Error('非交互式模式下需要 --environment 参数');
}
} else {
// 交互式:提示用户
const environment = await prompt({
type: 'select',
message: '选择环境:',
choices: ['development', 'staging', 'production'],
});
}状态管理
~/.mycli/
├── config.yml # 用户配置
├── cache/ # 缓存数据
│ ├── plugins.json
│ └── api-responses/
├── credentials.json # 敏感数据(600 权限)
└── state.json # 会话状态性能模式
// 延迟加载:不加载未使用的依赖
if (command === 'deploy') {
const deploy = require('./commands/deploy'); // 按需加载
await deploy.run();
}
// 缓存:避免重复的 API 调用
const cache = new Cache('~/.mycli/cache', { ttl: 3600 });
let plugins = await cache.get('plugins');
if (!plugins) {
plugins = await fetchPlugins();
await cache.set('plugins', plugins);
}
// 异步操作:不要不必要地阻塞
await Promise.all([
validateConfig(),
checkForUpdates(),
loadPlugins(),
]);版本控制与更新
// 检查更新(非阻塞)
checkForUpdates().then(update => {
if (update.available) {
console.log(`有可用更新:${update.version}`);
console.log(`运行:npm install -g mycli@latest`);
}
}).catch(() => {
// 静默失败 - 不中断用户工作流
});
// 版本兼容性
const MIN_NODE_VERSION = '18.0.0';
if (!semver.satisfies(process.version, `>=${MIN_NODE_VERSION}`)) {
console.error(`mycli 需要 Node.js ${MIN_NODE_VERSION} 或更高版本`);
process.exit(1);
}帮助文本设计
用法
mycli deploy [environment] [options]
参数
environment 目标环境(development|staging|production)
选项
-c, --config <file> 配置文件路径
-f, --force 跳过确认提示
-d, --dry-run 预览更改而不执行
-v, --verbose 显示详细输出
示例
# 部署到生产环境
mycli deploy production
# 预览预发布环境部署
mycli deploy staging --dry-run
# 使用自定义配置
mycli deploy --config ./custom.yml
了解更多:https://docs.mycli.dev/deployNode.js CLI 开发
Commander.js(推荐)
现代化、优雅的 CLI 框架,支持 TypeScript。
#!/usr/bin/env node
import { Command } from 'commander';
import { version } from './package.json';
const program = new Command();
program
.name('mycli')
.description('我的强大 CLI 工具')
.version(version);
// 简单命令
program
.command('init')
.description('初始化新项目')
.option('-t, --template <type>', '项目模板', 'default')
.option('-f, --force', '覆盖已存在的文件')
.action(async (options) => {
console.log(`正在使用模板初始化:${options.template}`);
});
// 带参数的命令
program
.command('deploy <environment>')
.description('部署到环境')
.option('--dry-run', '预览而不执行')
.action(async (environment, options) => {
if (options.dryRun) {
console.log(`将部署到:${environment}`);
} else {
await deploy(environment);
}
});
// 嵌套子命令
const config = program.command('config').description('管理配置');
config
.command('get <key>')
.description('获取配置值')
.action((key) => console.log(getConfig(key)));
config
.command('set <key> <value>')
.description('设置配置值')
.action((key, value) => setConfig(key, value));
program.parse();Yargs(替代方案)
强大的参数解析,支持中间件。
#!/usr/bin/env node
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
yargs(hideBin(process.argv))
.command(
'deploy <env>',
'部署到环境',
(yargs) => {
return yargs
.positional('env', {
describe: '环境名称',
choices: ['dev', 'staging', 'prod'],
})
.option('force', {
alias: 'f',
type: 'boolean',
description: '强制部署',
});
},
async (argv) => {
await deploy(argv.env, { force: argv.force });
}
)
.middleware([(argv) => {
// 在所有命令之前验证
if (!isConfigValid()) {
throw new Error('配置无效');
}
}])
.demandCommand()
.help()
.parse();交互式提示(Inquirer)
美观的交互式提示,用于用户输入。
import inquirer from 'inquirer';
// 文本输入
const { name } = await inquirer.prompt([
{
type: 'input',
name: 'name',
message: '项目名称:',
default: 'my-project',
validate: (input) => input.length > 0 || '名称不能为空',
},
]);
// 从列表选择
const { environment } = await inquirer.prompt([
{
type: 'list',
name: 'environment',
message: '选择环境:',
choices: ['development', 'staging', 'production'],
default: 'development',
},
]);
// 复选框(多选)
const { features } = await inquirer.prompt([
{
type: 'checkbox',
name: 'features',
message: '选择功能:',
choices: [
{ name: 'TypeScript', checked: true },
{ name: 'ESLint', checked: true },
{ name: 'Prettier', checked: true },
{ name: 'Jest', checked: false },
],
},
]);
// 确认
const { confirmed } = await inquirer.prompt([
{
type: 'confirm',
name: 'confirmed',
message: '部署到生产环境?',
default: false,
},
]);
// 密码
const { password } = await inquirer.prompt([
{
type: 'password',
name: 'password',
message: '输入密码:',
mask: '*',
},
]);终端输出(Chalk)
彩色终端输出,支持正确的 TTY 检测。
import chalk from 'chalk';
// 基本颜色
console.log(chalk.blue('信息:') + '正在开始部署...');
console.log(chalk.green('成功:') + '部署完成');
console.log(chalk.yellow('警告:') + '使用了已弃用的标志');
console.log(chalk.red('错误:') + '部署失败');
// 样式
console.log(chalk.bold.underline('重要'));
console.log(chalk.dim('不那么重要'));
// 模板
const success = chalk.green.bold;
const error = chalk.red.bold;
console.log(success('✓') + ' 构建成功');
console.log(error('✗') + ' 构建失败');
// 为 CI 禁用颜色
const log = {
info: (msg) => console.log(chalk.blue('ℹ'), msg),
success: (msg) => console.log(chalk.green('✔'), msg),
warn: (msg) => console.log(chalk.yellow('⚠'), msg),
error: (msg) => console.log(chalk.red('✖'), msg),
};
// 自动检测 TTY 和 CI 环境进度指示器(Ora)
优雅的终端加载动画和进度指示器。
import ora from 'ora';
// 简单加载动画
const spinner = ora('加载中...').start();
await doWork();
spinner.succeed('完成!');
// 更新文本
const spinner = ora('开始中...').start();
spinner.text = '处理中...';
await process();
spinner.text = '完成中...';
await finalize();
spinner.succeed('完成!');
// 不同状态
spinner.start('正在安装依赖...');
// ... 工作
spinner.succeed('依赖已安装');
// 或
spinner.fail('安装失败');
// 或
spinner.warn('跳过了一些包');
// 或
spinner.info('使用缓存的包');
// 多个加载动画
const spinners = {
api: ora('正在部署 API...').start(),
web: ora('正在部署 Web 应用...').start(),
db: ora('正在运行迁移...').start(),
};
await Promise.all([
deployApi().then(() => spinners.api.succeed()),
deployWeb().then(() => spinners.web.succeed()),
runMigrations().then(() => spinners.db.succeed()),
]);进度条(cli-progress)
import cliProgress from 'cli-progress';
// 单个进度条
const bar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);
bar.start(100, 0);
for (let i = 0; i <= 100; i++) {
await processItem(i);
bar.update(i);
}
bar.stop();
// 多进度条
const multibar = new cliProgress.MultiBar({
clearOnComplete: false,
hideCursor: true,
});
const bar1 = multibar.create(100, 0, { task: 'API' });
const bar2 = multibar.create(100, 0, { task: 'Web' });
await Promise.all([
processApi(bar1),
processWeb(bar2),
]);
multibar.stop();文件系统辅助工具
import fs from 'fs-extra';
import { globby } from 'globby';
import path from 'path';
// 带模板复制
await fs.copy('templates/app', targetDir, {
filter: (src) => !src.includes('node_modules'),
});
// 读/写 JSON
const config = await fs.readJson('config.json');
await fs.writeJson('output.json', data, { spaces: 2 });
// 确保目录存在
await fs.ensureDir('dist/assets');
// 查找文件
const files = await globby(['src/**/*.ts', '!src/**/*.test.ts']);错误处理
import { Command } from 'commander';
program
.command('deploy')
.action(async () => {
try {
await deploy();
} catch (error) {
if (error.code === 'EACCES') {
console.error(chalk.red('权限被拒绝'));
console.error('尝试使用 sudo 运行或检查文件权限');
process.exit(77);
} else if (error.code === 'ENOENT') {
console.error(chalk.red('文件未找到:'), error.path);
process.exit(127);
} else {
console.error(chalk.red('部署失败:'), error.message);
if (process.env.DEBUG) {
console.error(error.stack);
}
process.exit(1);
}
}
});
// 处理 SIGINT(Ctrl+C)
process.on('SIGINT', () => {
console.log('\n操作已取消');
process.exit(130);
});Package.json 设置
{
"name": "mycli",
"version": "1.0.0",
"type": "module",
"bin": {
"mycli": "./bin/cli.js"
},
"files": [
"bin/",
"lib/",
"templates/"
],
"engines": {
"node": ">=18.0.0"
},
"dependencies": {
"commander": "^11.0.0",
"inquirer": "^9.0.0",
"chalk": "^5.0.0",
"ora": "^7.0.0"
}
}测试 CLI
import { execaCommand } from 'execa';
import { describe, it, expect } from 'vitest';
describe('mycli', () => {
it('显示版本', async () => {
const { stdout } = await execaCommand('node bin/cli.js --version');
expect(stdout).toMatch(/\d+\.\d+\.\d+/);
});
it('显示帮助', async () => {
const { stdout } = await execaCommand('node bin/cli.js --help');
expect(stdout).toContain('用法:');
});
it('处理无效命令', async () => {
await expect(
execaCommand('node bin/cli.js invalid')
).rejects.toThrow();
});
});CLI 用户体验模式
进度指示器
使用场景
确定性(已知总数):
[████████████░░░░░░░░] 60% (3/5 个文件)
使用场景:文件操作、下载、批处理
不确定性(未知持续时间):
⠋ 加载中...
使用场景:API 调用、数据库查询、等待外部服务
多步骤:
✓ 依赖已安装
⠋ 正在构建应用...
⏳ 正在运行测试...
使用场景:多阶段操作(构建、部署等)进度条最佳实践
好:
[████████████░░░░░░░░] 60% | 120/200 MB | 2.4 MB/s | 剩余时间:33s
↑ 视觉条 ↑ 百分比 ↑ 当前进进 ↑ 速度 ↑ 时间
组成部分:
- 视觉条(20-40 字符)
- 百分比(已知时)
- 当前/总计(带单位)
- 速度/速率(适用时)
- 预计剩余时间(ETA)
差:
处理中...(无反馈)
60%(无上下文)
[████████████████████████████████████████](太宽)加载动画样式
⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏ 点(优雅、低调)
⣾ ⣽ ⣻ ⢿ ⡿ ⣟ ⣯ ⣷ 块(醒目、引人注意)
◐ ◓ ◑ ◒ 圆形(经典)
▖ ▘ ▝ ▗ 角(极简)
⠁ ⠂ ⠄ ⡀ ⢀ ⠠ ⠐ ⠈ 线条(微妙)
选择依据:
- 终端兼容性(Windows 使用 ASCII)
- 品牌形象(匹配工具个性)
- 上下文(后台任务微妙、主任务醒目)颜色使用
语义颜色
红色: 错误、失败、破坏性操作
黄色: 警告、弃用、非关键问题
绿色: 成功、完成、正面反馈
蓝色: 信息、提示、中性消息
青色: 命令、代码、技术细节
洋红色: 高亮、特殊项目
灰色: 次要、元数据、时间戳
示例:
✓ 成功:部署完成
✗ 错误:文件未找到
⚠ 警告:使用了已弃用的标志 --old-flag
ℹ 信息:使用来自 ~/.mycli/cache 的缓存何时禁用颜色
// 检测非 TTY 输出(管道到文件等)
const noColor = !process.stdout.isTTY ||
process.env.NO_COLOR ||
process.env.CI === 'true';
if (noColor) {
// 禁用颜色
}
// 支持 NO_COLOR 标准
// https://no-color.org/颜色可访问性
- 不要仅依赖颜色(同时使用符号)
- 提供高对比度(在各种终端中测试)
- 支持色盲(红/绿替代方案)
好:
✓ 构建成功(绿色)
✗ 构建失败(红色)
↑ 符号在无颜色时也能工作
差:
Success(仅有颜色,无符号)
Failed(仅有颜色,无符号)帮助文本设计
命令帮助结构
用法
mycli <命令> [选项]
命令
init 初始化新项目
deploy 部署到环境
config 管理配置
plugins 管理插件
选项
-h, --help 显示帮助
-v, --version 显示版本
--config FILE 配置文件路径
运行 'mycli <命令> --help' 获取命令的更多信息。
示例
# 初始化新项目
mycli init my-app
# 部署到生产环境
mycli deploy production --dry-run
了解更多:https://docs.mycli.dev子命令帮助
用法
mycli deploy <环境> [选项]
参数
environment 目标环境(必需)
可选值:development、staging、production
选项
-c, --config <file> 配置文件路径
默认值:./mycli.config.yml
-f, --force 跳过确认提示
生产环境中请谨慎使用
-d, --dry-run 预览更改而不执行
显示将发生的操作
-v, --verbose 显示详细输出
包含调试信息
示例
# 部署到生产环境(带确认)
mycli deploy production
# 预览预发布环境部署
mycli deploy staging --dry-run
# 使用自定义配置
mycli deploy production --config ./prod.yml
# 强制部署,不提示
mycli deploy production --force
更多信息,请访问 https://docs.mycli.dev/deploy错误消息
好的错误消息
模式:[上下文] → [问题] → [解决方案]
示例 1:文件未找到
✗ 错误:未找到配置文件
已搜索的位置:
• ./mycli.config.yml
• ~/.config/mycli/config.yml
• /etc/mycli/config.yml
解决方案:
• 运行 'mycli init' 创建配置文件
• 使用 --config 指定不同的位置
• 检查文件权限
示例 2:验证错误
✗ 错误:无效的环境 'prod'
应为以下之一:
• development
• staging
• production
您是否指 'production'?
示例 3:权限错误
✗ 错误:写入 /etc/mycli/config.yml 时权限被拒绝
此操作需要提升的权限。
尝试:
• 使用 sudo 运行:sudo mycli config set key value
• 使用用户配置:mycli config set --user key value
• 检查文件权限:ls -la /etc/mycli/config.yml错误消息指南
应该做:
✓ 具体明确("端口 3000 已被占用" 而非 "端口不可用")
✓ 显示上下文("在文件 config.yml 第 42 行")
✓ 建议解决方案("尝试运行 'mycli fix'")
✓ 使用通俗语言("文件未找到" 而非 "ENOENT")
不应该做:
✗ 向用户显示堆栈跟踪(保留给 --debug)
✗ 使用技术术语("EACCES: permission denied")
✗ 让用户困住("无效输入" 而无解释)
✗ 模糊不清("出了问题")交互式提示
提示类型
文本输入:
项目名称:my-awesome-app
↑ 清晰的标签
选择(单选):
? 选择环境:(使用方向键)
❯ development
staging
production
复选框(多选):
? 选择功能:(按空格选择,回车确认)
◉ TypeScript
◯ ESLint
◉ Prettier
◯ Jest
确认:
? 部署到生产环境?(y/N)
↑ 默认为否(更安全)
密码:
? 输入密码:********
↑ 遮罩输入提示指南
应该做:
✓ 显示键盘提示("使用方向键"、"按空格")
✓ 提供合理的默认值(预选常用选项)
✓ 允许使用 Ctrl+C 跳过
✓ 立即验证输入
✓ 在最终操作前显示预览/摘要
不应该做:
✗ 在 CI/CD 环境中要求交互
✗ 问显而易见的问题(确认每个操作)
✗ 隐藏下一步会发生什么
✗ 让用户重复输入信息输出格式化
表格
好:
┌─────────────┬──────────┬──────────┐
│ 环境 │ 状态 │ 更新时间 │
├─────────────┼──────────┼──────────┤
│ production │ ✓ 活跃 │ 2小时前 │
│ staging │ ✓ 活跃 │ 5分钟前 │
│ development │ ✗ 停止 │ 1天前 │
└─────────────┴──────────┴──────────┘
极简(用于脚本):
环境 状态 更新时间
production 活跃 2小时前
staging 活跃 5分钟前
development 停止 1天前
JSON(用于程序化使用):
[
{"env": "production", "status": "active", "updated": "2小时前"},
{"env": "staging", "status": "active", "updated": "5分钟前"}
]列表
项目符号列表:
功能:
• TypeScript 支持
• 热重载
• 自动格式化
编号列表:
部署步骤:
1. 构建应用
2. 运行测试
3. 部署到服务器
4. 验证部署
树形结构:
my-app/
├── src/
│ ├── components/
│ └── utils/
├── tests/
└── package.json状态消息
实时更新
多步骤过程:
✓ 依赖已安装(2.3秒)
✓ 应用已构建(8.1秒)
⠋ 正在运行测试...(当前)
⏳ 部署中...(待处理)
⏳ 验证中...(待处理)
更新:
⠋ 正在安装依赖...
→ npm install
✓ 依赖已安装(2.3秒)
⠋ 正在构建应用...
→ webpack build
✓ 应用已构建(8.1秒)
→ 输出:dist/(2.4 MB)摘要/完成
✓ 部署完成!
摘要:
环境: production
版本: v1.2.3
持续时间: 2分34秒
部署时间: 2023-12-14 10:30:45 UTC
后续步骤:
• 查看日志:mycli logs production
• 监控: mycli status production
• 回滚: mycli rollback production
URL:https://app.example.com调试和详细模式
正常模式(默认):
✓ 部署到生产环境成功(2分34秒)
详细模式(--verbose):
[10:30:12] 正在开始部署...
[10:30:13] 正在从 ./mycli.config.yml 加载配置
[10:30:14] 正在连接生产服务器...
[10:30:15] 正在上传文件(124 个文件,2.4 MB)...
[10:30:28] 正在运行部署后钩子...
[10:32:46] ✓ 部署完成
调试模式(--debug):
[DEBUG] 已加载配置:{env: 'production', ...}
[DEBUG] SSH 连接已建立:user@host
[DEBUG] 正在执行:rsync -avz ./dist/ user@host:/var/www/
[DEBUG] 输出:sending incremental file list...
[DEBUG] 退出码:0
✓ 部署到生产环境成功(2分34秒)
用法:
# 正常:简洁输出
mycli deploy production
# 详细:详细步骤
mycli deploy production --verbose
# 调试:包括内部的所有内容
DEBUG=* mycli deploy productionMan 页面格式
名称
mycli-deploy - 将应用部署到环境
简介
mycli deploy <环境> [选项]
描述
将应用部署到指定环境。
支持 development、staging 和 production 环境。
选项
-c, --config <文件>
配置文件路径
默认值:./mycli.config.yml
-f, --force
跳过所有确认提示
生产环境中请谨慎使用
-d, --dry-run
预览部署而不执行
显示将要部署的内容
示例
部署到生产环境:
mycli deploy production
预览预发布环境部署:
mycli deploy staging --dry-run
参见
mycli-init(1), mycli-config(1), mycli-rollback(1)