UNPKG

@itriton/sftp

Version:

基于ssh2-sftp-client的项目部署工具,支持密钥证书登录和配置文件管理

157 lines (156 loc) 6.48 kB
#!/usr/bin/env node 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';