@itriton/sftp
Version:
基于ssh2-sftp-client的项目部署工具,支持密钥证书登录和配置文件管理
157 lines (156 loc) • 6.48 kB
JavaScript
import { Command } from 'commander';
import chalk from 'chalk';
import { initConfig, getConfig, listConfigs, configExists } from './config.js';
import { run } from './run.js';
const program = new Command();
// 设置程序信息
program
.name('itriton-sftp')
.description('基于ssh2-sftp-client的项目部署工具,支持密钥证书登录和配置文件管理')
.version('0.0.1');
// init命令 - 初始化配置文件
program
.command('init')
.description('初始化SFTP配置文件')
.option('-n, --name <name>', '配置名称', 'default')
.option('-f, --force', '强制覆盖现有配置文件', false)
.option('--no-interactive', '使用默认模板,不进行交互式配置', false)
.action(async (options) => {
try {
const initOptions = {
name: options.name,
force: options.force,
interactive: options.interactive
};
await initConfig(initOptions);
}
catch (error) {
console.error(chalk.red(`❌ 初始化失败: ${error instanceof Error ? error.message : 'Unknown error'}`));
process.exit(1);
}
});
// run命令 - 执行SFTP上传
program
.command('run')
.description('执行SFTP文件上传')
.option('-c, --config <name>', '指定配置名称')
.option('-v, --verbose', '显示详细日志', false)
.option('-d, --dry-run', '试运行,不实际上传文件', false)
.option('-f, --force', '强制覆盖远程文件', false)
.action(async (options) => {
try {
// 检查配置文件是否存在
if (!configExists()) {
console.error(chalk.red('❌ 配置文件不存在,请先运行 "itriton-sftp init" 初始化配置'));
process.exit(1);
}
// 获取配置
const config = getConfig(options.config);
// 运行选项
const runOptions = {
config: options.config,
verbose: options.verbose,
dryRun: options.dryRun,
force: options.force
};
console.log(chalk.blue(`📋 使用配置: ${config.name}`));
if (options.dryRun) {
console.log(chalk.yellow('🔍 试运行模式'));
}
// 执行上传
const result = await run(config, runOptions);
if (result.success) {
console.log(chalk.green('✅ 上传完成!'));
console.log(chalk.blue(`📊 统计信息:`));
console.log(chalk.blue(` - 上传文件: ${result.uploadedFiles} 个`));
if (result.deletedFiles > 0) {
console.log(chalk.blue(` - 删除文件: ${result.deletedFiles} 个`));
}
console.log(chalk.blue(` - 总耗时: ${result.duration}ms`));
}
else {
console.error(chalk.red(`❌ 上传失败: ${result.error}`));
process.exit(1);
}
}
catch (error) {
console.error(chalk.red(`❌ 运行失败: ${error instanceof Error ? error.message : 'Unknown error'}`));
process.exit(1);
}
});
// list命令 - 列出所有配置
program
.command('list')
.alias('ls')
.description('列出所有配置')
.action(() => {
try {
if (!configExists()) {
console.log(chalk.yellow('⚠️ 配置文件不存在,请先运行 "itriton-sftp init" 初始化配置'));
return;
}
const configs = listConfigs();
if (configs.length === 0) {
console.log(chalk.yellow('⚠️ 没有找到任何配置'));
return;
}
console.log(chalk.blue('📋 可用配置:'));
configs.forEach(configName => {
try {
const config = getConfig(configName);
console.log(chalk.green(` • ${configName}`));
console.log(chalk.gray(` ${config.description || '无描述'}`));
console.log(chalk.gray(` 服务器: ${config.connection.host}:${config.connection.port || 22}`));
console.log(chalk.gray(` 本地: ${config.run.localPath} -> 远程: ${config.run.remotePath}`));
}
catch {
console.log(chalk.red(` • ${configName} (配置有误)`));
}
});
}
catch (error) {
console.error(chalk.red(`❌ 列出配置失败: ${error instanceof Error ? error.message : 'Unknown error'}`));
process.exit(1);
}
});
// config命令 - 显示配置详情
program
.command('config')
.description('显示配置详情')
.argument('[name]', '配置名称')
.action((name) => {
try {
if (!configExists()) {
console.log(chalk.yellow('⚠️ 配置文件不存在,请先运行 "itriton-sftp init" 初始化配置'));
return;
}
const config = getConfig(name);
console.log(chalk.blue(`📋 配置详情: ${config.name}`));
console.log(chalk.blue(`📝 描述: ${config.description || '无描述'}`));
console.log(chalk.blue(`🌐 服务器信息:`));
console.log(chalk.blue(` - 主机: ${config.connection.host}`));
console.log(chalk.blue(` - 端口: ${config.connection.port || 22}`));
console.log(chalk.blue(` - 用户名: ${config.connection.username}`));
console.log(chalk.blue(` - 认证方式: ${config.connection.privateKey ? '私钥' : '密码'}`));
console.log(chalk.blue(`📁 路径配置:`));
console.log(chalk.blue(` - 本地目录: ${config.run.localPath}`));
console.log(chalk.blue(` - 远程目录: ${config.run.remotePath}`));
console.log(chalk.blue(`⚙️ 其他设置:`));
console.log(chalk.blue(` - 清空远程目录: ${config.run.cleanRemote ? '是' : '否'}`));
console.log(chalk.blue(` - 保持目录结构: ${config.run.preserveStructure ? '是' : '否'}`));
if (config.run.exclude && config.run.exclude.length > 0) {
console.log(chalk.blue(` - 排除文件: ${config.run.exclude.join(', ')}`));
}
}
catch (error) {
console.error(chalk.red(`❌ 显示配置失败: ${error instanceof Error ? error.message : 'Unknown error'}`));
process.exit(1);
}
});
// 解析命令行参数
program.parse();
// 导出主要功能
export { initConfig, getConfig, listConfigs, configExists } from './config.js';
export { run } from './run.js';
export * from './types.js';