mirror of
https://github.com/ZeroCatDev/ClassworksKV.git
synced 2025-07-01 11:59:22 +00:00
136 lines
3.9 KiB
JavaScript
136 lines
3.9 KiB
JavaScript
#!/usr/bin/env node
|
||
import { execSync } from "child_process";
|
||
import fs from "fs";
|
||
import path from "path";
|
||
import dotenv from "dotenv";
|
||
|
||
dotenv.config();
|
||
|
||
const PRISMA_DIR = path.join(process.cwd(), "prisma");
|
||
const DATABASE_TYPE = process.env.DATABASE_TYPE || "sqlite";
|
||
const DATABASE_URL =
|
||
DATABASE_TYPE === "sqlite"
|
||
? "file:/data/db.sqlite"
|
||
: process.env.DATABASE_URL;
|
||
|
||
// 🔄 执行数据库迁移函数
|
||
function runDatabaseMigration() {
|
||
try {
|
||
console.log("🔄 执行数据库迁移...");
|
||
execSync("npx prisma migrate deploy", { stdio: "inherit" });
|
||
console.log("✅ 数据库迁移完成");
|
||
} catch (error) {
|
||
console.error("❌ 数据库迁移失败:", error.message);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// 🧱 数据库初始化函数
|
||
function setupDatabase() {
|
||
try {
|
||
// 如果是 SQLite,确保 /data 目录存在
|
||
if (DATABASE_TYPE === "sqlite") {
|
||
if (!fs.existsSync("/data")) {
|
||
fs.mkdirSync("/data", { recursive: true });
|
||
}
|
||
} else if (!DATABASE_URL) {
|
||
console.error("❌ 缺少 DATABASE_URL 环境变量");
|
||
process.exit(1);
|
||
}
|
||
|
||
// 从对应数据库类型的配置目录中复制配置文件
|
||
const sourceDir = path.join(PRISMA_DIR, "database", DATABASE_TYPE);
|
||
if (!fs.existsSync(sourceDir)) {
|
||
console.error(`❌ 数据库配置未找到:${sourceDir}`);
|
||
process.exit(1);
|
||
}
|
||
|
||
// 递归复制函数
|
||
function copyRecursive(src, dest) {
|
||
const stats = fs.statSync(src);
|
||
if (stats.isDirectory()) {
|
||
if (!fs.existsSync(dest)) {
|
||
fs.mkdirSync(dest, { recursive: true });
|
||
}
|
||
const entries = fs.readdirSync(src);
|
||
for (const entry of entries) {
|
||
copyRecursive(path.join(src, entry), path.join(dest, entry));
|
||
}
|
||
} else {
|
||
fs.copyFileSync(src, dest);
|
||
}
|
||
}
|
||
|
||
// 将所有配置文件和目录复制到 prisma 根目录下
|
||
const entries = fs.readdirSync(sourceDir);
|
||
for (const entry of entries) {
|
||
const sourcePath = path.join(sourceDir, entry);
|
||
const targetPath = path.join(PRISMA_DIR, entry);
|
||
copyRecursive(sourcePath, targetPath);
|
||
}
|
||
console.log(`✅ 已复制 ${DATABASE_TYPE} 数据库配置文件和目录`);
|
||
|
||
// 执行数据库迁移
|
||
runDatabaseMigration();
|
||
} catch (error) {
|
||
console.error("❌ 数据库初始化失败:", error.message);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// 🔨 本地构建函数
|
||
function buildLocal() {
|
||
try {
|
||
// 确保数据库迁移已执行
|
||
runDatabaseMigration();
|
||
execSync("npm install", { stdio: "inherit" }); // 安装依赖
|
||
execSync("npx prisma generate", { stdio: "inherit" }); // 生成 Prisma 客户端
|
||
console.log("✅ 构建完成");
|
||
} catch (error) {
|
||
console.error("❌ 构建失败:", error.message);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// 🚀 启动服务函数
|
||
function startServer() {
|
||
try {
|
||
console.log(`🚀 使用 ${DATABASE_TYPE} 数据库启动服务中...`);
|
||
execSync("npm run start", { stdio: "inherit" }); // 启动项目
|
||
} catch (error) {
|
||
console.error("❌ 服务启动失败:", error.message);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// ▶️ 执行 Prisma CLI 命令函数
|
||
function runPrismaCommand(args) {
|
||
try {
|
||
const command = `npx prisma ${args.join(" ")}`;
|
||
execSync(command, { stdio: "inherit" });
|
||
} catch (error) {
|
||
console.error("❌ Prisma 命令执行失败:", error.message);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// 🧠 主函数,根据命令行参数判断执行哪种流程
|
||
async function main() {
|
||
const args = process.argv.slice(2); // 获取命令行参数
|
||
if (args[0] === "prisma") {
|
||
// 如果输入的是 prisma 命令,则执行 prisma 子命令
|
||
runPrismaCommand(args.slice(1));
|
||
} else {
|
||
// 否则按默认流程:初始化 → 构建 → 启动服务
|
||
setupDatabase();
|
||
buildLocal();
|
||
startServer();
|
||
}
|
||
}
|
||
|
||
// 🚨 捕捉主函数异常
|
||
main().catch((error) => {
|
||
console.error("❌ 脚本执行失败:", error);
|
||
process.exit(1);
|
||
});
|