/** * CLI 入口:oss-upload 命令。 * 使用动态 import 加载依赖,避免启动时加载全部模块。 * .env 在打包时已注入 dist/cli.cjs,运行时不再读取。 */ import type { UploadSummary } from './core/reporter'; (async () => { const [{ Command }, { uploadDirectory }] = await Promise.all([ import('commander'), import('./middleware/OssService'), ]); const { ScriptReporter } = await import('./core/reporter'); const program = new Command(); let actionResult: UploadSummary | undefined; let outputResultArray = false; program .name('oss-upload') .description('上传本地目录到 OSS(当前为华为 OBS)') .argument('', '本地目录') .option('-b, --bucket ', 'Bucket 名称', '') .option('-e, --env ', '环境标识,如 dev/test/prod', 'dev') .option('--path-prefix ', '业务路径前缀,将拼在 base/env 后面', 'jhr') .option('--include ', '包含的文件模式(可多次)') .option('--exclude ', '排除的文件模式(可多次)') .option('--hash', '上传的文件名后拼接文件内容 hash(用于缓存失效)') .action(async (localDir: string, options: any) => { const { loadObsCredentialsFromUrlIfNeeded } = await import('./config/loadObsCredentialsFromUrl'); await loadObsCredentialsFromUrlIfNeeded(); options.env = options.env || 'dev'; if(!options.bucket) { if(['prod', 'production'].includes(options.env.toLowerCase())) { options.bucket = 'hr-pro'; } else { options.bucket = 'hr-uat'; } } try { const summary = await uploadDirectory({ env: options.env, bucket: options.bucket, localDir, pathPrefix: options.pathPrefix, include: options.include, exclude: options.exclude, hash: options.hash, reporter: options.hash ? new ScriptReporter() : undefined, }); actionResult = summary; if (options.hash) outputResultArray = true; if (summary.failed.length > 0) { process.exitCode = 1; } } catch (err: any) { // eslint-disable-next-line no-console console.error('上传过程中发生错误:', err?.message || err); process.exitCode = 1; } }); await program.parseAsync(process.argv); if (outputResultArray && actionResult) { // eslint-disable-next-line no-console console.log(JSON.stringify(actionResult.success)); } })();