mirror of
https://github.com/ZeroCatDev/ClassworksKV.git
synced 2025-07-01 20:09:23 +00:00
113 lines
3.2 KiB
JavaScript
113 lines
3.2 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 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);
|
||
}
|
||
|
||
// 将所有配置文件复制到 prisma 根目录下
|
||
const files = fs.readdirSync(sourceDir);
|
||
for (const file of files) {
|
||
const sourcePath = path.join(sourceDir, file);
|
||
const targetPath = path.join(PRISMA_DIR, file);
|
||
fs.copyFileSync(sourcePath, targetPath);
|
||
}
|
||
console.log(`✅ 已复制 ${DATABASE_TYPE} 数据库配置文件`);
|
||
|
||
// 设置 Prisma 的 DATABASE_URL
|
||
process.env.DATABASE_URL = DATABASE_URL;
|
||
|
||
// 检查数据库表并执行必要的迁移
|
||
execSync(
|
||
"npx prisma migrate dev --name update-" +
|
||
new Date().toISOString().split("T")[0],
|
||
{ stdio: "inherit" }
|
||
);
|
||
} catch (error) {
|
||
console.error("❌ 数据库初始化失败:", error.message);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// 🔨 本地构建函数
|
||
function buildLocal() {
|
||
try {
|
||
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);
|
||
});
|