#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"
Простой и довольно простой способ запуска тестов, например, как босс, в зависимости от среды.