6dc051f26d
Load production env without .env override; sync-api-env targets .env.production; PM2 NODE_ENV=production; Prisma uses with-api-env.cjs on deploy. Co-authored-by: Cursor <cursoragent@cursor.com>
31 lines
941 B
TypeScript
31 lines
941 B
TypeScript
import { config } from 'dotenv';
|
|
import { existsSync } from 'fs';
|
|
import { resolve } from 'path';
|
|
|
|
/**
|
|
* 环境变量加载策略(后加载的文件覆盖先前的同名键):
|
|
*
|
|
* - 本地开发:仅 `.env` + `.env.local`
|
|
* `.env.development` 仅作参考模板,不自动加载
|
|
*
|
|
* - 服务器(NODE_ENV=production):仅 `.env.production` + `.env.production.local`
|
|
* 不使用 `.env`,避免与本地开发配置混淆
|
|
*/
|
|
const apiRoot = resolve(__dirname, '..');
|
|
const nodeEnv = process.env.NODE_ENV ?? 'development';
|
|
const isProduction = nodeEnv === 'production';
|
|
|
|
const layers = isProduction
|
|
? [resolve(apiRoot, '.env.production'), resolve(apiRoot, '.env.production.local')]
|
|
: [resolve(apiRoot, '.env'), resolve(apiRoot, '.env.local')];
|
|
|
|
for (const file of layers) {
|
|
if (existsSync(file)) {
|
|
config({ path: file, override: true });
|
|
}
|
|
}
|
|
|
|
if (!process.env.NODE_ENV) {
|
|
process.env.NODE_ENV = nodeEnv;
|
|
}
|