1
0
mirror of https://github.com/ZeroCatDev/ClassworksKV.git synced 2025-07-01 11:59:22 +00:00
ClassworksKV/classworks.js

136 lines
3.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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);
});