nodejs чтение файла конфигурации .ini - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть файл конфигурации. Переменные хранятся следующим образом.

[general]
webapp=/var/www
data=/home/data


[env]
WEBAPP_DEPLOY=${general:webapp}/storage/deploy
SYSTEM_DEPLOY=${general:data}/deploy

Как вы можете видеть, в нем есть 2 раздела: general и env. В разделе env используются переменные из раздела general.

Поэтому я хочу прочитать этот файл в переменную. Допустим, конфиг. Вот я хочу, чтобы объект конфигурации выглядел следующим образом:

{
    general: {
        webapp: '/var/www',
        data: '/home/data'
    },
    env: {
        WEBAPP_DEPLOY: '/var/www/storage/deploy',
        SYSTEM_DEPLOY: '/home/data/deploy'
    }
}

В общем, я ищу парсер конфигурации для nodejs, который поддерживает интерполяцию строк.

1 Ответ

1 голос
/ 25 апреля 2020

Я бы предположил, что большинство библиотек ini не включают в себя функции расширения переменных, но с примитивами loda sh обобщенный c "глубокий заменитель объекта" не слишком сложен.

Я переключил : разделитель для ., поэтому имеет и get может искать значения напрямую.

const { get, has, isPlainObject, reduce } = require('lodash')

// Match all tokens like `${a.b}` and capture the variable path inside the parens
const re_token = /\${([\w$][\w\.$]*?)}/g

// If a string includes a token and the token exists in the object, replace it
function tokenReplace(value, key, object){
  if (!value || !value.replace) return value
  return value.replace(re_token, (match_string, token_path) => {
    if (has(object, token_path)) return get(object, token_path)
    return match_string
  })
}

// Deep clone any plain objects and strings, replacing tokens
function plainObjectReplacer(node, object = node){
  return reduce(node, (result, value, key) => {
    result[key] = (isPlainObject(value))
      ? plainObjectReplacer(value, object)
      : tokenReplace(value, key, object)
    return result
  }, {})
}
> plainObjectReplacer({ a: { b: { c: 1 }}, d: 'wat', e: '${d}${a.b.c}' })
{ a: { b: { c: 1 } }, d: 'wat', e: 'wat1' }

Вы найдете большинство инструментов управления конфигурациями (например, ansible), которые могут выполнить такое расширение переменных перед выполнением приложения при развертывании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...