build-deploy-tools
Version:
构建部署工具包 - 支持文件复制、SVN操作、系统通知确认等功能,具有科技感进度条和现代化UI
269 lines (235 loc) • 8.97 kB
JavaScript
#!/usr/bin/env node
/**
* 构建后文件复制命令行工具
* 基于原始 build-copy.js 重构的命令行版本
*
* 使用方法:
* 1. 交互模式(默认):
* build-copy
* npx build-deploy-tools build-copy
*
* 2. 自动模式:
* build-copy --auto
* npx build-deploy-tools build-copy --auto
*
* 3. 自动模式 + 自动提交:
* build-copy --auto --commit
* npx build-deploy-tools build-copy --auto --commit
*
* 4. 禁用通知:
* build-copy --no-notification
*
* 5. 自定义构建文件名:
* build-copy --build=myapp
*
* 6. 自定义目标目录:
* build-copy --target=D:/Work/Vue3/myproject
*/
const path = require('path')
const { BuildDeployTools, utils, notification } = require('../index')
/**
* 解析命令行参数
* @returns {Object} 解析后的配置对象
*/
function parseArguments () {
const args = process.argv.slice(2)
// 从环境变量获取默认值
const envConfig = utils.getEnvConfig()
const config = {
fileName: utils.getFileName(),
targetParentDir: utils.getTargetDir('D:/Work/Vue3/yiyumsaas'), // 从环境变量或默认值获取目标目录
sourceDir: null, // 将在后面设置
autoCommit: null, // null表示使用配置自动判断
commitMessage: process.env.COMMIT_MESSAGE || null, // 从环境变量获取自定义提交信息
useVcsHistory: process.env.USE_VCS_HISTORY !== 'false', // 从环境变量获取是否使用版本控制历史
commitOptions: {}, // 提交信息格式化选项
showHelp: false
}
for (const arg of args) {
if (arg === '--help' || arg === '-h') {
config.showHelp = true
} else if (arg.startsWith('--build=')) {
config.fileName = arg.split('=')[1]
} else if (arg.startsWith('--target=')) {
config.targetParentDir = arg.split('=')[1]
} else if (arg.startsWith('--source=')) {
config.sourceDir = arg.split('=')[1]
} else if (arg.startsWith('--message=')) {
config.commitMessage = arg.split('=')[1]
} else if (arg.startsWith('--commit-message=')) {
config.commitMessage = arg.split('=')[1]
} else if (arg === '--commit') {
config.autoCommit = true
} else if (arg === '--no-commit') {
config.autoCommit = false
} else if (arg === '--no-vcs-history') {
config.useVcsHistory = false
} else if (arg === '--add-timestamp') {
config.commitOptions.addTimestamp = true
} else if (arg.startsWith('--prefix=')) {
config.commitOptions.prefix = arg.split('=')[1]
} else if (arg.startsWith('--suffix=')) {
config.commitOptions.suffix = arg.split('=')[1]
}
}
return config
}
/**
* 显示帮助信息
*/
function showHelp () {
console.log(`
构建后文件复制工具 v${require('../package.json').version}
用途:
将构建后的文件复制到指定目录并可选提交到SVN
用法:
build-copy [选项]
选项:
--build=<文件名> 指定构建文件名 (默认: vam3)
--target=<目录> 指定目标父目录 (默认: D:/Work/Vue3/yiyumsaas)
--source=<目录> 指定源目录 (默认: 使用构建文件名)
--auto 启用自动模式
--commit 强制自动提交到SVN
--no-commit 禁止提交到SVN
--message=<信息> 自定义提交信息
--commit-message=<信息> 自定义提交信息(同--message)
--no-vcs-history 不使用版本控制历史信息
--add-timestamp 在提交信息中添加时间戳
--prefix=<前缀> 为提交信息添加前缀
--suffix=<后缀> 为提交信息添加后缀
--no-notification 禁用系统通知
--help, -h 显示此帮助信息
环境变量:
# 基础配置
TARGET_DIR=<目录> # 指定目标目录(优先级高于默认值)
SOURCE_DIR=<目录> # 指定源目录(优先级高于默认值)
BUILD_NAME=<文件名> # 指定构建文件名(优先级高于默认值)
# npm配置(通过 npm run script --key=value 或 export npm_config_key=value)
npm_config_target=<目录> # 指定目标目录
npm_config_source=<目录> # 指定源目录
npm_config_build=<文件名> # 指定构建文件名
# 自动化配置
CI=true # CI环境自动启用自动模式
AUTO_MODE=true # 启用自动模式
AUTO_COMMIT=true # 启用自动提交
npm_config_auto=true # 启用自动模式(npm配置方式)
npm_config_commit_cli=true # 启用自动提交(npm配置方式)
npm_config_notification=false # 禁用通知
USE_NOTIFICATION=false # 禁用通知(环境变量方式)
# 提交配置
COMMIT_MESSAGE=<信息> # 自定义提交信息
USE_VCS_HISTORY=false # 禁用版本控制历史(默认true)
# 重试配置
MAX_RETRIES=<次数> # 最大重试次数
RETRY_DELAY=<毫秒> # 重试延迟时间
示例:
build-copy
build-copy --auto
build-copy --auto --commit
build-copy --build=myapp --target=D:/Work/Projects
build-copy --message="修复登录问题" --commit
build-copy --auto --add-timestamp --prefix="[部署]"
build-copy --no-vcs-history --message="手动部署"
build-copy --no-notification
智能提交信息:
- 优先级:自定义信息 > Git最近提交 > SVN最近提交 > 默认信息
- 自动从当前Git/SVN仓库获取最近一次提交信息
- 支持格式化选项:前缀、后缀、时间戳
注意:
- 请确保已执行构建命令生成相应文件
- SVN操作需要在目标目录中有SVN工作副本
- 自动模式下会根据配置自动执行,无需用户交互
`)
}
/**
* 主函数
*/
async function main () {
const config = parseArguments()
// 显示帮助信息
if (config.showHelp) {
showHelp()
return
}
// 构建源目录路径 - 优先使用环境变量或命令行参数,否则使用默认逻辑
let sourceDir = config.sourceDir
if (!sourceDir) {
// 尝试从环境变量获取源目录
const envSourceDir = utils.getSourceDir()
if (envSourceDir) {
sourceDir = path.isAbsolute(envSourceDir)
? envSourceDir
: path.resolve(process.cwd(), envSourceDir)
} else {
// 默认逻辑:从当前工作目录开始,使用构建文件名
sourceDir = path.resolve(process.cwd(), config.fileName)
}
} else {
// 如果命令行参数指定了源目录,确保是绝对路径
sourceDir = path.isAbsolute(sourceDir)
? sourceDir
: path.resolve(process.cwd(), sourceDir)
}
config.sourceDir = sourceDir
// 显示运行信息
const autoConfig = utils.getAutoConfig()
console.log(`🚀 开始执行构建后复制任务`)
console.log(
`📋 运行模式: ${autoConfig.isAutoMode ? '🤖 自动模式' : '👤 交互模式'}`
)
console.log(`📋 源目录: ${config.sourceDir}`)
console.log(`📋 目标目录: ${config.targetParentDir}`)
if (autoConfig.isAutoMode) {
const finalAutoCommit =
config.autoCommit !== null ? config.autoCommit : autoConfig.autoCommit
console.log(`📋 自动提交: ${finalAutoCommit ? '✅ 启用' : '❌ 禁用'}`)
console.log(
`📋 使用通知: ${autoConfig.useNotification ? '✅ 启用' : '❌ 禁用'}`
)
}
// 🆕 显示提交信息配置
if (config.commitMessage) {
console.log(`📋 自定义提交信息: "${config.commitMessage}"`)
}
console.log(
`📋 使用版本控制历史: ${config.useVcsHistory ? '✅ 启用' : '❌ 禁用'}`
)
if (Object.keys(config.commitOptions).length > 0) {
console.log(`📋 提交信息选项:`, config.commitOptions)
}
try {
// 创建工具实例
const tools = new BuildDeployTools()
// 执行构建复制流程
await tools.executeBuildCopy(config)
console.log('🎉 构建复制任务完成!')
process.exit(0)
} catch (error) {
console.error('❌ 构建复制任务失败:', error.message)
await notification.notify('错误', '构建复制失败', {
sound: true,
timeout: 15
})
process.exit(1)
}
}
// 处理未捕获的异常
process.on('uncaughtException', error => {
console.error('❌ 未捕获的异常:', error.message)
process.exit(1)
})
process.on('unhandledRejection', (reason, promise) => {
console.error('❌ 未处理的Promise拒绝:', reason)
process.exit(1)
})
// 🔧 只有在直接运行时才执行main函数
if (require.main === module) {
// 运行主函数
main()
}
// 🔧 导出供编程使用
module.exports = {
main,
parseArguments,
showHelp
}