61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
import { existsSync, readFileSync } from 'node:fs';
|
|
import path from 'node:path';
|
|
|
|
import { parse } from 'dotenv';
|
|
|
|
import {
|
|
loadApiConfig,
|
|
loadSchedulerConfig,
|
|
loadWorkerConfig,
|
|
type ApiRuntimeConfig,
|
|
type SchedulerRuntimeConfig,
|
|
type WorkerRuntimeConfig,
|
|
} from './runtime-config';
|
|
|
|
type ProcessName = 'api' | 'scheduler' | 'worker';
|
|
|
|
function findRepositoryRoot(startDirectory: string): string {
|
|
let current = path.resolve(startDirectory);
|
|
|
|
while (true) {
|
|
if (existsSync(path.join(current, 'pnpm-workspace.yaml'))) return current;
|
|
const parent = path.dirname(current);
|
|
if (parent === current) throw new Error('无法定位项目根目录');
|
|
current = parent;
|
|
}
|
|
}
|
|
|
|
function readDevelopmentEnv(processName: ProcessName): NodeJS.ProcessEnv {
|
|
const repositoryRoot = findRepositoryRoot(__dirname);
|
|
const envFile = path.join(
|
|
repositoryRoot,
|
|
'deploy',
|
|
'env',
|
|
'development',
|
|
`${processName}.env.local`,
|
|
);
|
|
|
|
if (!existsSync(envFile)) {
|
|
throw new Error(`缺少本地开发配置:deploy/env/development/${processName}.env.local`);
|
|
}
|
|
|
|
return { ...process.env, ...parse(readFileSync(envFile)) };
|
|
}
|
|
|
|
function resolveProcessEnvironment(processName: ProcessName): NodeJS.ProcessEnv {
|
|
// 生产环境只信任 systemd/Compose 注入的 process.env,绝不读取仓库内开发配置。
|
|
return process.env.APP_ENV === 'production' ? process.env : readDevelopmentEnv(processName);
|
|
}
|
|
|
|
export function loadApiProcessConfig(): ApiRuntimeConfig {
|
|
return loadApiConfig(resolveProcessEnvironment('api'));
|
|
}
|
|
|
|
export function loadSchedulerProcessConfig(): SchedulerRuntimeConfig {
|
|
return loadSchedulerConfig(resolveProcessEnvironment('scheduler'));
|
|
}
|
|
|
|
export function loadWorkerProcessConfig(): WorkerRuntimeConfig {
|
|
return loadWorkerConfig(resolveProcessEnvironment('worker'));
|
|
}
|