Это может быть хорошим местом для использования npm-config .
При запуске сценариев (см. Npm-scripts (7)) ключи package.json "config"перезаписываются в среде, если есть параметр конфигурации <name>[@<version>]:<key>
Я бы не использовал их для каждого типа параметра конфигурации переменной, но я думаю, что это хорошее решение для простых случаев, таких как URL ипорты потому что:
- Вы помещаете их непосредственно в package.json.
- Кроме того, вы можете указать их в командной строке или в качестве переменных ENV.
- Все, что угоднозапуск через npm может ссылаться на них (например, скрипты).
- Вы можете установить их для каждого пользователя с помощью `npm config set foo: порт 80
Единственное предостережение в том, чтоПараметр config
в вашем package.json автоматически экспортируется в среду только тогда, когда вы запускаете свой код через npm.Итак, если вы просто запустите его с узлом, например, node ./myapp.js
, то вы не можете ожидать, что process.env.npm_package_config_foo
будет содержать ваше значение.Тем не менее, вы всегда можете var pkg = require('./package.json');
и получить доступ к значениям в pkg.config
.
Поскольку это может быть неочевидным, я бы также добавил, что переменные окружения npm_package_config
не всплывают в приложениях, которыезависит от вашего пакета npm.Итак, если ваш зависимый пакет ссылается на process.env.npm_package_config_foo
, то зависимый пакет должен определить это в своем собственном package.json.Я предполагаю, что, поскольку это npm_package_config, не имеет смысла толкать их все вверх по дереву.
Итак, как бы я использовал одну конфигурационную переменную npm, чтобы она работала по всему дереву?, как в базовом пакете, так и в пакетах, которые от него зависят?Это немного сбивает с толку, и мне пришлось разобраться с этим методом проб и ошибок.
Допустим, у вас есть пакет разъем и пакет клиент . клиент зависит от соединителя , и вы хотите указать параметр конфигурации для соединителя , который можно использовать или перезаписать в клиенте .Если вы используете process.env.npm_package_config.port
в вашем соединителе модуле, то, когда он зависит от модуля client , эта переменная не будет экспортирована, и она будет иметь неопределенное значение.
Однако, если вы вместо этого используете process.env.npm_config_connector_port
(обратите внимание, что первый начинается с npm_package_config , а другой с npm_config_packagename ), тогда вы можете по крайней мере установить это в своем.npmrc использует npm config set connector:port 80
и он будет "пространством имен" как process.env.npm__config_connector_port
везде, где вы запускаете npm, включая сценарии, которые вы запускаете в клиенте , которые зависят от соединителя , и вывсегда сможете перезаписать его в командной строке, в вашем ENV или в .npmrc.Вам просто нужно помнить, что, как и для любой переменной среды, она не всегда может быть установлена.Итак, я бы использовал оператор по умолчанию с process.env.npm_config_connector_port
в качестве первого (предпочтительного) значения:
var port = process.env.npm_config_connector_port || sane_default
Здесь sane_default может быть заполнено из одногоиз других рекомендуемых методов.Лично мне нравится хранить данные конфигурации, подобные этим, в файлах JSON как минимум, и package.json кажется лучшим файлом JSON для их размещения. Сохраняйте их в данных вместо кода, и тогда вы сможете легкоиспользуйте статический встроенный JSON, генерируйте их динамически или извлекайте из файловой системы, URL-адресов или баз данных.