通过 VITE_AUTO_FILL_TEST 环境变量控制,在 .env.test 中启用, 使测试环境构建后登录框也能自动填充测试账号,方便测试人员使用。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
117 lines
3.9 KiB
JavaScript
117 lines
3.9 KiB
JavaScript
const { execSync } = require("child_process")
|
||
const path = require("path")
|
||
const fs = require("fs")
|
||
|
||
/**
|
||
* 压缩前端打包文件
|
||
* 压缩包放在根目录下,文件名格式: competition-web-{env}-v{version}.tgz
|
||
*
|
||
* 用法:
|
||
* node scripts/compress.cjs test - 测试环境
|
||
* node scripts/compress.cjs production - 生产环境
|
||
*/
|
||
function compressFrontend() {
|
||
const rootDir = path.join(__dirname, "..")
|
||
const sourceDir = path.join(rootDir, "dist")
|
||
const outputDir = rootDir
|
||
|
||
// 获取环境参数
|
||
const env = process.argv[2]
|
||
if (!env || !["test", "production"].includes(env)) {
|
||
console.error("❌ 错误: 请指定环境参数")
|
||
console.error(" 用法: node scripts/compress.cjs <test|production>")
|
||
console.error(" 示例: node scripts/compress.cjs test")
|
||
console.error(" 示例: node scripts/compress.cjs production")
|
||
process.exit(1)
|
||
}
|
||
|
||
// 从 package.json 读取版本号
|
||
const packageJsonPath = path.join(rootDir, "package.json")
|
||
let version = "1.0.0"
|
||
try {
|
||
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"))
|
||
version = packageJson.version || "1.0.0"
|
||
} catch (error) {
|
||
console.warn(`⚠️ 无法读取 package.json 版本号,使用默认版本: ${version}`)
|
||
}
|
||
|
||
// 检查源目录是否存在
|
||
if (!fs.existsSync(sourceDir)) {
|
||
console.error("❌ 错误: 前端打包文件不存在")
|
||
console.error(` 路径: ${sourceDir}`)
|
||
console.error(
|
||
` 请先运行 pnpm build:${env === "test" ? "test" : ""} 构建前端项目`,
|
||
)
|
||
process.exit(1)
|
||
}
|
||
|
||
// 删除之前的所有压缩包
|
||
console.log("🧹 清理旧的压缩包...\n")
|
||
try {
|
||
const files = fs.readdirSync(outputDir)
|
||
const oldZipFiles = files.filter(
|
||
(file) => file.startsWith("competition-web-") && file.endsWith(".tgz"),
|
||
)
|
||
|
||
if (oldZipFiles.length > 0) {
|
||
oldZipFiles.forEach((file) => {
|
||
const filePath = path.join(outputDir, file)
|
||
try {
|
||
fs.unlinkSync(filePath)
|
||
console.log(` ✅ 已删除: ${file}`)
|
||
} catch (error) {
|
||
console.warn(` ⚠️ 删除失败: ${file} - ${error.message}`)
|
||
}
|
||
})
|
||
console.log("")
|
||
} else {
|
||
console.log(" ℹ️ 没有找到旧的压缩包\n")
|
||
}
|
||
} catch (error) {
|
||
console.warn(` ⚠️ 清理旧压缩包时出错: ${error.message}\n`)
|
||
}
|
||
|
||
// 生成文件名: competition-web-{env}-v{version}.tgz
|
||
const zipFileName = `competition-web-${env}-v${version}.tgz`
|
||
const zipFilePath = path.join(outputDir, zipFileName)
|
||
|
||
console.log("📦 开始压缩前端打包文件...\n")
|
||
console.log(` 环境: ${env}`)
|
||
console.log(` 版本: v${version}`)
|
||
console.log(` 源目录: ${sourceDir}`)
|
||
console.log(` 输出文件: ${zipFilePath}\n`)
|
||
|
||
try {
|
||
// 使用相对路径,避免 Windows tar 路径问题
|
||
const tarCommand = `tar -czf "${zipFileName}" -C dist .`
|
||
|
||
execSync(tarCommand, {
|
||
cwd: rootDir,
|
||
stdio: "inherit",
|
||
shell: true,
|
||
env: { ...process.env },
|
||
})
|
||
|
||
// 检查文件是否创建成功
|
||
if (fs.existsSync(zipFilePath)) {
|
||
const stats = fs.statSync(zipFilePath)
|
||
const fileSizeMB = (stats.size / (1024 * 1024)).toFixed(2)
|
||
console.log(`\n✅ 压缩完成!`)
|
||
console.log(` 文件: ${zipFileName}`)
|
||
console.log(` 大小: ${fileSizeMB} MB`)
|
||
console.log(` 路径: ${zipFilePath}`)
|
||
} else {
|
||
throw new Error("压缩文件未生成")
|
||
}
|
||
} catch (error) {
|
||
console.error("\n❌ 压缩失败:", error.message)
|
||
console.error("\n提示:")
|
||
console.error(" 1. 确保已安装tar命令 (Windows 10+内置支持)")
|
||
console.error(" 2. 确保有足够的磁盘空间")
|
||
console.error(" 3. 确保输出目录有写入权限")
|
||
process.exit(1)
|
||
}
|
||
}
|
||
|
||
compressFrontend()
|