В моем package.json есть небольшой фрагмент конфигурации:
{
"name": "who-rules-app",
"config": {
"foo": "bar",
"words": [
"tpr",
"rules"
]
},
"scripts": {
"start": "node src/index.js"
}
}
Насколько я могу судить, люди обычно получают доступ к ключу config
с помощью process.env['npm_package_${keyname}']
, например:
process.env['npm_package_config_foo']
//> "bar"
Но когда значение представляет собой массив, вы получаете этот ультрасовременный набор сплющенных пронумерованных ключей:
process.env['npm_package_config_words_0']
//> "tpr"
process.env['npm_package_config_words_1']
//> "rules"
Я всегда мог просто прочитать файл с диска с помощью fs
, но, насколько я понимаю, выполнение действий с помощью process.env
позволяет этому материалу взаимодействовать с переменными среды, что является довольно отличным способом обработки конфигурации в разных средах.
В идеале хотелось бы:
process.env['npm_package_config_words']
//> [ "tpr", "rules" ]
Есть ли способ лучше? Хорошо протестированный модуль? Классный узор?
Любая помощь приветствуется.
Вместо того, чтобы использовать хакерский метод process.env, любая последняя версия Node с радостью загрузит файлы .json прямо из коробки, поэтому просто напишите что-нибудь вроде:
let package = require('./package.json');
let config = package.config || {};
let words = config.words || [];
И это все, что вам нужно сделать.
Конечно, загрузка файла напрямую будет работать отлично. Но, как я уже сказал, я боюсь потерять любое взаимодействие с env vars, которое в настоящее время происходит как часть взлома process.env
. Вы говорите, что их нет? Или вы предлагаете повторно реализовать это поведение поверх обычного чтения файла?
Зачем было бы взаимодействие? Вы, как программист, несете ответственность за то, какое значение вы используете; ваша среда выполнения и ваш package.json не влияют друг на друга. Если вам нужны значения из вашего package.json, загрузите package.json. Если вам нужны значения из вашего env, используйте process.env, а если вам нужен лучший контроль env, начните использовать реальный пакет среды, такой как dotenv (который по-прежнему не взаимодействует с вашим package.json - ваша среда не имеет ничего общего со значениями в ваш package.json)
Я использую пакет dotenv для переменных среды.
Dotenv is a zero-dependency module that loads environment variables from a .env file into process.env
В вашем config.js
require('dotenv').config()
.env файл
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
Вы можете использовать их как
const db = require('db')
db.connect({
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASS
})
не уверен, действительно ли вам нужна ваша конфигурация внутри файла package.json, но если нет, я обычно использую эту библиотеку для установки переменных env npmjs.com/package/dotenv