Skip to content

Instantly share code, notes, and snippets.

@ruvasik
Created May 31, 2024 14:47
Show Gist options
  • Save ruvasik/2adfc0a122715789b9674a285a193b85 to your computer and use it in GitHub Desktop.
Save ruvasik/2adfc0a122715789b9674a285a193b85 to your computer and use it in GitHub Desktop.
Powerful loading .env* files with yarn workspaces
// loadEnv.js
const dotenv = require('dotenv');
const dotenvExpand = require('dotenv-expand').expand;
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
// Функция для загрузки и расширения .env файлов с выводом для отладки
function loadAndExpandEnv(envPaths) {
envPaths.forEach(envPath => {
if (fs.existsSync(envPath)) {
const envConfig = dotenv.config({ path: envPath });
const expandedEnvConfig = dotenvExpand(envConfig);
// Явно обновляем process.env новыми значениями
if (expandedEnvConfig.parsed) {
for (const key in expandedEnvConfig.parsed) {
process.env[key] = expandedEnvConfig.parsed[key];
}
}
}
});
}
// Получите значение NODE_ENV или установите его в 'development' по умолчанию
const nodeEnv = process.env.NODE_ENV || 'development';
// Определите пути к .env файлам в корневом каталоге в нужном порядке
const rootEnvPaths = [
path.resolve(__dirname, `.env.${nodeEnv}.local`),
path.resolve(__dirname, '.env.local'),
path.resolve(__dirname, `.env.${nodeEnv}`),
path.resolve(__dirname, '.env')
];
// Определите пути к .env файлам в текущем рабочем пространстве в нужном порядке
const workspaceEnvPaths = [
path.resolve(process.cwd(), `.env.${nodeEnv}.local`),
path.resolve(process.cwd(), '.env.local'),
path.resolve(process.cwd(), `.env.${nodeEnv}`),
path.resolve(process.cwd(), '.env')
];
// Загрузите и расширьте переменные окружения из корневых .env файлов
loadAndExpandEnv(rootEnvPaths);
// Загрузите и расширьте переменные окружения из .env файлов в рабочем пространстве
loadAndExpandEnv(workspaceEnvPaths);
// Постройте команду из аргументов, переданных скрипту
const command = process.argv.slice(2).join(' ');
// Запустите команду с переменными окружения
execSync(command, { stdio: 'inherit', env: process.env });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment