Запуск тестов с использованием разных env. переменных в зависимости от команды в package.json

#node.js #mocha.js

#node.js #mocha.js

Вопрос:

Пытаюсь найти общепринятое решение о том, как запускать тесты в зависимости от тестовой команды в package.json с соответствующими переменными среды из файла .env.

.env. //file

 BASE_URL=dev
BASE_URL=stage
API_DEV=api-dev
API_STG=api-stage
 

package.json //file

 "test:dev": "mocha ...",
"test:stage": "mocha ...",
 

Запуск теста: dev Я хочу получить для своих тестов все переменные для среды разработки.

Могу ли я настроить его таким образом?

Комментарии:

1. Я думаю, вы можете просто передать переменную env вместе со своей командой и прочитать это в своем более позднем scirpt: "test:dev": "APP_ENV=dev mocha ..." и получить доступ к переменной process.env.APP_ENV в вашем скрипте, чтобы обнаружить env и подготовить необходимые конфигурации.

2. @ma Спасибо за ответ, но, пытаясь, я не могу добиться успеха, возможно, я делаю что-то не так. У меня есть 2 файла: .env и .env.stage, и когда я запускаю "test:stage": "env=stage mocha" , он в любом случае запускает переменные из .env вместо .env.stage. Что я делаю не так?

3. хотя, может быть, я понял, попробую прямо сейчас

4. Хорошо, я изменил его, но все равно не работает. Я добавил переменные APP_ENV={env} в .env и .env.stage. , но в моих файлах конфигурации у меня везде есть process.env.{var}, поэтому я просто, я думаю, не видит .env.stage при запуске "test:stage": "env=stage mocha" , потому что он находится в .env.stage…

Ответ №1:

Допустим, у вас package.json есть следующее свойство scripts-

 "test:local": "APP_ENV=local mocha ...",
"test:dev": "APP_ENV=dev mocha ...",
"test:stage": "APP_ENV=stage mocha ...",
"test:prod": "APP_ENV=prod mocha ..."
 

И давайте предположим, что у вас есть следующие файлы: .env для prod , .env.stage для stage и .env.dev для dev среды.

Теперь в вашем скрипте вы можете динамически загружать env файлы с помощью dotenv package .

 switch (process.env.APP_ENV) {
    case 'dev':
        env_suffix = ".dev";
        break;
    case 'stage':
        env_suffix = ".stage";
        break;
    case 'local':
        env_suffix = ".local";
        break;
}

require("dotenv").config({
    path: path.join(__dirname   "/../", ".env"   env_suffix)
});
 

Таким образом, вы можете иметь переменные среды в своем process.env объекте

Комментарии:

1. Привет, maksbd19! Спасибо за ваш ответ. Это хороший вариант, но я уже понял, как это сделать каким-то лаконичным способом, я опубликую его в ответе 🙂

2. Привет, maksbd19, это сработало, большое спасибо за помощь.

Ответ №2:

Хорошо, я решил это так:

В config папке у меня есть .env
stage.env
prod.env

и иметь index.js файл, в котором:

 const {NODE_ENV = 'dev'} = process.env;
const dotenv = require('dotenv').config({path: `${__dirname}/${NODE_ENV}.env`});

module.exports = {

    api: {
        url: dotenv.parsed.API_BASE || ''
    },

    elastic: {
        host: dotenv.parsed.ELASTIC_HOST || ''
    }
};
 

и в package json у меня есть:

 "elastic:dev": "mocha ./test/elasticsearch/*.js",
"elastic:stage": "NODE_ENV=stage mocha ./test/elasticsearch/*.js",
"elastic:prod": "NODE_ENV=prod mocha ./test/elasticsearch/*.js"
 

Простой и довольно простой способ запуска тестов, например, как босс, в зависимости от среды.