From 13f3bf519851e54004c5e565b3b7dccc9c610510 Mon Sep 17 00:00:00 2001 From: JianMiau Date: Mon, 13 Jul 2026 15:44:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9Achangelog=20?= =?UTF-8?q?=E7=94=A2=E7=94=9F=E5=99=A8=E4=BF=9D=E7=95=99=E6=97=A2=E6=9C=89?= =?UTF-8?q?=E7=B4=80=E9=8C=84=EF=BC=8C=E9=81=BF=E5=85=8D=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E5=BE=8C=E6=9B=B4=E6=96=B0=E7=B4=80=E9=8C=84=E8=A2=AB=E6=B8=85?= =?UTF-8?q?=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根本原因:Docker build 內沒有 .git,generate-changelog 讀不到 git log 時會把 changelog.json 覆蓋成空清單,導致正式站的更新紀錄分頁變成空白。 影響:正式版更新紀錄分頁的資料完整性;package.json 的 npm start 行為與縮排格式。 修法: - git 取不到資料(或 0 筆)且既有 changelog.json 非空時,直接沿用不覆蓋 - package.json 的 start 改為 npm run dev,縮排統一為 tab Co-Authored-By: Claude Fable 5 --- package.json | 80 +++++++++++++++++----------------- scripts/generate-changelog.mjs | 24 +++++++++- 2 files changed, 62 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index 7922465..fd57da7 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,41 @@ { - "name": "badminton-scoreboard", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "gen:changelog": "node scripts/generate-changelog.mjs", - "predev": "node scripts/generate-changelog.mjs", - "dev": "concurrently \"npm:dev:server\" \"npm:dev:client\"", - "dev:client": "vite", - "dev:server": "node server/server.mjs", - "prebuild": "node scripts/generate-changelog.mjs", - "build": "tsc -b && vite build", - "lint": "eslint .", - "preview": "vite preview", - "start": "node server/server.mjs" - }, - "dependencies": { - "concurrently": "^9.2.1", - "dotenv": "^17.4.2", - "express": "^5.2.1", - "mysql2": "^3.22.0", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "react-router-dom": "^7.14.1" - }, - "devDependencies": { - "@eslint/js": "^9.39.4", - "@types/node": "^24.12.2", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.1", - "eslint": "^9.39.4", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.5.2", - "globals": "^17.4.0", - "typescript": "~6.0.2", - "typescript-eslint": "^8.58.0", - "vite": "^8.0.4" - } -} + "name": "badminton-scoreboard", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "gen:changelog": "node scripts/generate-changelog.mjs", + "predev": "node scripts/generate-changelog.mjs", + "dev": "concurrently \"npm:dev:server\" \"npm:dev:client\"", + "dev:client": "vite", + "dev:server": "node server/server.mjs", + "prebuild": "node scripts/generate-changelog.mjs", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview", + "start": "npm run dev" + }, + "dependencies": { + "concurrently": "^9.2.1", + "dotenv": "^17.4.2", + "express": "^5.2.1", + "mysql2": "^3.22.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } +} \ No newline at end of file diff --git a/scripts/generate-changelog.mjs b/scripts/generate-changelog.mjs index 638d5c5..47a4a07 100644 --- a/scripts/generate-changelog.mjs +++ b/scripts/generate-changelog.mjs @@ -1,7 +1,7 @@ // 從 git log 產生更新紀錄資料,輸出到 src/data/changelog.json // 正式版(build 後)沒有 git 也能直接讀 JSON 顯示;dev 與 build 前會自動重新產生。 import { execFileSync } from 'node:child_process' -import { mkdirSync, writeFileSync } from 'node:fs' +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { fileURLToPath } from 'node:url' @@ -35,13 +35,33 @@ function readGitLog() { }) } +// 讀取既有的 changelog.json(Docker build 內由 COPY . . 帶進來),取不到時回傳 null。 +function readExisting() { + try { + const data = JSON.parse(readFileSync(outFile, 'utf8')) + return Array.isArray(data.entries) ? data.entries : null + } catch { + return null + } +} + function main() { let entries = [] try { entries = readGitLog() } catch (error) { - console.warn('[generate-changelog] 讀取 git log 失敗,輸出空清單:', error.message) + console.warn('[generate-changelog] 讀取 git log 失敗:', error.message) + } + + // git 取不到(或拿到 0 筆,常見於 Docker build 內沒有 .git)時, + // 若已有非空的 changelog.json 就沿用,避免把好資料覆蓋成空清單。 + if (entries.length === 0) { + const existing = readExisting() + if (existing && existing.length > 0) { + console.log(`[generate-changelog] git 無資料,保留既有 ${existing.length} 筆更新紀錄不覆蓋`) + return + } } const payload = {