'use strict' const path = require('path') // 平台差异集中在这一个文件里:用户数据的基座目录、服务端可执行文件名、XDG 的两个目录。 // platform 与 env 一样是**入参**(缺省按 Windows 解析 —— 这是这些函数改动前就有的口径), // 生产调用点传 process.platform / process.env;纯函数才能把两个平台都断言一遍。 // 默认值刻意不写 process.platform:否则同一份调用在不同机器上解析出不同结果, // 测试与现场会各跑一套,Windows 分支也没法被钉住。 // 用户数据那一级目录的名字。它原来叫 LOCAL_BASE(Windows 上就挂在 %LOCALAPPDATA% 下), // Linux 上挂在 $XDG_DATA_HOME 下,名字本身与平台无关,所以改成中性一点的名字。 const APP_DIR_NAME = 'ScoreboardConsole' // 服务端可执行文件名:Windows 是 scoreboard.exe,Linux(飞腾 D2000 上的 linux/arm64 静态 // 编译产物)没有后缀。写死一个名字必然有一边找不到程序。 function serverExeName(platform) { return (platform || 'win32') === 'win32' ? 'scoreboard.exe' : 'scoreboard' } function readEnv(env, name) { const value = env ? env[name] : '' return typeof value === 'string' ? value.trim() : '' } // XDG 规范:$XDG_DATA_HOME 必须是绝对路径,没设 / 空 / 相对路径时一律退回 ~/.local/share。 // 两个都拿不到时返回 null,由调用方回落到安装目录 —— 与 Windows 上拿不到 %LOCALAPPDATA% // 时同一套处理(宁可让现场看见一条警告,也不猜一个路径)。 function xdgDataHome(env) { const xdg = readEnv(env, 'XDG_DATA_HOME') if (xdg && path.isAbsolute(xdg)) return xdg const home = readEnv(env, 'HOME') // HOME 也要求绝对路径:拼出来的相对路径会随进程的工作目录变,比没有更糟 return home && path.isAbsolute(home) ? path.join(home, '.local', 'share') : null } // 同一套规格的 $XDG_CONFIG_HOME / ~/.config:开机自启的 .desktop 放在它的 autostart/ 下 function xdgConfigHome(env) { const xdg = readEnv(env, 'XDG_CONFIG_HOME') if (xdg && path.isAbsolute(xdg)) return xdg const home = readEnv(env, 'HOME') return home && path.isAbsolute(home) ? path.join(home, '.config') : null } module.exports = { APP_DIR_NAME, serverExeName, xdgDataHome, xdgConfigHome }