0Pricing
Lua Academy · Урок

Создание DSL конфигурации

Создайте декларативный язык конфигурации, загружаемый через dofile() в песочнице.

«Создание DSL конфигурации» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Цель: декларативная конфигурация

DSL конфигурации позволяет пользователям описывать конфигурацию в понятном декларативном стиле, используя при этом всю мощь Lua (условия, циклы и функции).

Шаблон функции конфигурации

Предоставьте функцию config(tbl), которая проверяет и сохраняет конфигурацию. Вызывайте её с литералом таблицы для удобного синтаксиса.

local function config(tbl)
  -- validate and store
  return tbl
end
-- config.lua:
return config {
  host = "localhost",
  port = 8080,
  debug = os.getenv("DEBUG") == "1",
}

Вложенная конфигурация с разделами

Поддерживайте вложенные разделы для упорядоченной конфигурации.

return config {
  database = { host="db.local", port=5432 },
  cache    = { host="cache.local", ttl=300 },
  logging  = { level="INFO", file="/var/log/app.log" },
}

Вспомогательные функции в конфигурации

Разрешите вызывать вспомогательные функции внутри конфигурации для вычисления значений.

local function env(name, default)
  return os.getenv(name) or default
end
return config {
  host  = env("DB_HOST", "localhost"),
  port  = tonumber(env("DB_PORT", "5432")),
}

Загрузка конфигурации в изолированной среде

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

local function loadConfig(path)
  local safeEnv = {
    config = config,
    env    = env,
    math   = math,
    table  = table,
  }
  local fn, err = loadfile(path, "t", safeEnv)
  if not fn then error(err) end
  return fn()
end

Проверка схемы

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

local function validate(cfg)
  assert(type(cfg.host) == "string", "host must be string")
  assert(type(cfg.port) == "number", "port must be number")
  assert(cfg.port > 0 and cfg.port < 65536, "port out of range")
end
validate(loadConfig("config.lua"))

Значения по умолчанию

Объединяйте загруженную конфигурацию со значениями по умолчанию, чтобы у всех обязательных ключей были значения.

local defaults = {host="localhost", port=8080, debug=false}
local function loadWithDefaults(path)
  local cfg = loadConfig(path)
  for k, v in pairs(defaults) do
    if cfg[k] == nil then cfg[k] = v end
  end
  return cfg
end

Переопределение из окружения

Разрешите переменным окружения переопределять значения из файла конфигурации — это необходимо для проектирования приложения по методологии 12 факторов.

Наследование конфигурации

Загружайте базовую конфигурацию, а затем накладывайте конфигурацию для конкретной среды (разработка, подготовка, рабочая среда).

Неизменяемая конфигурация

После загрузки сделайте таблицу конфигурации неизменяемой с помощью __newindex, который выдаёт ошибку, предотвращая случайное изменение во время выполнения.

Документирование конфигурации

Используйте комментарии и структурированные имена ключей для самодокументирования. Хорошо спроектированный DSL конфигурации понятен командам DevOps без дополнительных пояснений.

Вопрос о DSL конфигурации

Зачем загружать файл конфигурации с изолированным _ENV?

Итоги: создание DSL конфигурации

Предоставьте функцию config(tbl). Поддерживайте вложенные разделы и вспомогательные функции. Загружайте конфигурацию в изолированной среде. Проверяйте обязательные поля и типы. Предоставляйте значения по умолчанию и разрешайте переопределение переменными окружения для соответствия методологии 12 факторов.

Часто задаваемые вопросы

Урок «Создание DSL конфигурации» бесплатный?

Да — полный текст урока «Создание DSL конфигурации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание DSL конфигурации»?

Создайте декларативный язык конфигурации, загружаемый через dofile() в песочнице. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Создание DSL конфигурации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Принципы проектирования DSL в Lua
  2. Перегрузка операторов для удобной работы с DSL
  3. Создание DSL конфигурации
  4. Простой анализатор выражений
← Назад к Lua Academy