File size: 6,498 Bytes
4bf0fdd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
/**
* 路径工具模块
* 统一处理 pkg 打包环境和开发环境下的路径获取
* @module utils/paths
*/
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
/**
* 检测是否在 pkg 打包环境中运行
* @type {boolean}
*/
export const isPkg = typeof process.pkg !== 'undefined';
/**
* 获取项目根目录
* @returns {string} 项目根目录路径
*/
export function getProjectRoot() {
if (isPkg) {
return path.dirname(process.execPath);
}
return path.join(__dirname, '../..');
}
/**
* 获取数据目录路径
* pkg 环境下使用可执行文件所在目录或当前工作目录
* @returns {string} 数据目录路径
*/
export function getDataDir() {
if (isPkg) {
// pkg 环境:优先使用可执行文件旁边的 data 目录
const exeDir = path.dirname(process.execPath);
const exeDataDir = path.join(exeDir, 'data');
// 检查是否可以在该目录创建文件
try {
if (!fs.existsSync(exeDataDir)) {
fs.mkdirSync(exeDataDir, { recursive: true });
}
return exeDataDir;
} catch (e) {
// 如果无法创建,尝试当前工作目录
const cwdDataDir = path.join(process.cwd(), 'data');
try {
if (!fs.existsSync(cwdDataDir)) {
fs.mkdirSync(cwdDataDir, { recursive: true });
}
return cwdDataDir;
} catch (e2) {
// 最后使用用户主目录
const homeDataDir = path.join(process.env.HOME || process.env.USERPROFILE || '.', '.antigravity', 'data');
if (!fs.existsSync(homeDataDir)) {
fs.mkdirSync(homeDataDir, { recursive: true });
}
return homeDataDir;
}
}
}
// 开发环境
return path.join(__dirname, '..', '..', 'data');
}
/**
* 获取公共静态文件目录
* @returns {string} public 目录路径
*/
export function getPublicDir() {
if (isPkg) {
// pkg 环境:优先使用可执行文件旁边的 public 目录
const exeDir = path.dirname(process.execPath);
const exePublicDir = path.join(exeDir, 'public');
if (fs.existsSync(exePublicDir)) {
return exePublicDir;
}
// 其次使用当前工作目录的 public 目录
const cwdPublicDir = path.join(process.cwd(), 'public');
if (fs.existsSync(cwdPublicDir)) {
return cwdPublicDir;
}
// 最后使用打包内的 public 目录(通过 snapshot)
return path.join(__dirname, '../../public');
}
// 开发环境
return path.join(__dirname, '../../public');
}
/**
* 获取图片存储目录
* @returns {string} 图片目录路径
*/
export function getImageDir() {
if (isPkg) {
// pkg 环境:优先使用可执行文件旁边的 public/images 目录
const exeDir = path.dirname(process.execPath);
const exeImageDir = path.join(exeDir, 'public', 'images');
try {
if (!fs.existsSync(exeImageDir)) {
fs.mkdirSync(exeImageDir, { recursive: true });
}
return exeImageDir;
} catch (e) {
// 如果无法创建,尝试当前工作目录
const cwdImageDir = path.join(process.cwd(), 'public', 'images');
try {
if (!fs.existsSync(cwdImageDir)) {
fs.mkdirSync(cwdImageDir, { recursive: true });
}
return cwdImageDir;
} catch (e2) {
// 最后使用用户主目录
const homeImageDir = path.join(process.env.HOME || process.env.USERPROFILE || '.', '.antigravity', 'images');
if (!fs.existsSync(homeImageDir)) {
fs.mkdirSync(homeImageDir, { recursive: true });
}
return homeImageDir;
}
}
}
// 开发环境
return path.join(__dirname, '../../public/images');
}
/**
* 获取 .env 文件路径
* @returns {string} .env 文件路径
*/
export function getEnvPath() {
if (isPkg) {
// pkg 环境:优先使用可执行文件旁边的 .env
const exeDir = path.dirname(process.execPath);
const exeEnvPath = path.join(exeDir, '.env');
if (fs.existsSync(exeEnvPath)) {
return exeEnvPath;
}
// 其次使用当前工作目录的 .env
const cwdEnvPath = path.join(process.cwd(), '.env');
if (fs.existsSync(cwdEnvPath)) {
return cwdEnvPath;
}
// 返回可执行文件目录的路径(即使不存在)
return exeEnvPath;
}
// 开发环境
return path.join(__dirname, '../../.env');
}
/**
* 获取配置文件路径集合
* @returns {{envPath: string, configJsonPath: string, examplePath: string}} 配置文件路径
*/
export function getConfigPaths() {
if (isPkg) {
// pkg 环境:优先使用可执行文件旁边的配置文件
const exeDir = path.dirname(process.execPath);
const cwdDir = process.cwd();
// 查找 .env 文件
let envPath = path.join(exeDir, '.env');
if (!fs.existsSync(envPath)) {
const cwdEnvPath = path.join(cwdDir, '.env');
if (fs.existsSync(cwdEnvPath)) {
envPath = cwdEnvPath;
}
}
// 查找 config.json 文件
let configJsonPath = path.join(exeDir, 'config.json');
if (!fs.existsSync(configJsonPath)) {
const cwdConfigPath = path.join(cwdDir, 'config.json');
if (fs.existsSync(cwdConfigPath)) {
configJsonPath = cwdConfigPath;
}
}
// 查找 .env.example 文件
let examplePath = path.join(exeDir, '.env.example');
if (!fs.existsSync(examplePath)) {
const cwdExamplePath = path.join(cwdDir, '.env.example');
if (fs.existsSync(cwdExamplePath)) {
examplePath = cwdExamplePath;
}
}
return { envPath, configJsonPath, examplePath };
}
// 开发环境
return {
envPath: path.join(__dirname, '../../.env'),
configJsonPath: path.join(__dirname, '../../config.json'),
examplePath: path.join(__dirname, '../../.env.example')
};
}
/**
* 计算相对路径用于日志显示
* @param {string} absolutePath - 绝对路径
* @returns {string} 相对路径或原路径
*/
export function getRelativePath(absolutePath) {
if (isPkg) {
const exeDir = path.dirname(process.execPath);
if (absolutePath.startsWith(exeDir)) {
return '.' + absolutePath.slice(exeDir.length).replace(/\\/g, '/');
}
const cwdDir = process.cwd();
if (absolutePath.startsWith(cwdDir)) {
return '.' + absolutePath.slice(cwdDir.length).replace(/\\/g, '/');
}
}
return absolutePath;
} |