Цель помощи Makefile

Вопрос или проблема

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

введите описание изображения здесь

На изображении выше я отметил текст, который необходимо интерпретировать файлом .env

Вот код:

SHELL := /bin/bash
include .env

ENV_FILE = .env

help:  ## Показать помощь.
    @awk 'BEGIN { \
        FS = ":.*##"; \
        printf "\nИспользование:\n  make \033[0;34m<цель>\033[0m\n\nЦели:\n" \
    } \
    /^[a-zA-Z_\/\-\$${}]+:.*?##/ { \
        targetName = $$1; \
        description = $$2; \
        if (match(targetName, "\\$\\{([^}]+)\\}")) { \
            varEnvName = substr(targetName, RSTART+1, RLENGTH-2); \
            gsub("\\$$\\{[a-zA-Z_]+\\}", varEnvName, targetName); \
        }; \
        printf "  \033[0;34m%-10s\033[0m %s\n", targetName, description \
    }' $(MAKEFILE_LIST)

call/${DOCKER_PHP_CONTAINER_NAME}/a: ## PHP // Динамическая помощь.
    @echo "Запуск динамической цели для ${DOCKER_PHP_CONTAINER_NAME}"

call/${DOCKER_NGINX_CONTAINER_NAME}/a: ## NGINX // Динамическая помощь.
    @echo "Запуск динамической цели для ${DOCKER_NGINX_CONTAINER_NAME}"

call/bpro_php/b: ## Фиксированная помощь.
    @echo "Запуск фиксированной цели..."

Ответ или решение

Для создания динамического и качественного целевого пункта "help" в Makefile, который интерпретирует переменные из файла .env, необходимо внести несколько изменений в ваш текущий код. Я предоставлю вам исправленную версию кода и поясню, как всё работает.

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

Вот исправленный пример:

SHELL := /bin/bash
include .env

help:  ## Показать справку.
    @echo -e "\nИспользование:\n  make \033[0;34m<target>\033[0m\n\nЦели:"
    @awk 'BEGIN { FS = ":.*##"; }
        /^[a-zA-Z_\/\-\$$]/ { \
            targetName = $$1; \
            description = $$2; \
            # Заменяем переменные в имени цели
            for (var in ENVIRON) { \
                gsub("\\$\\{"var"\\}", ENVIRON[var], targetName); \
            } \
            printf "  \033[0;34m%-10s\033[0m %s\n", targetName, description; \
        }' $(MAKEFILE_LIST)

call/${DOCKER_PHP_CONTAINER_NAME}/a: ## PHP // Динамическая помощь.
    @echo "Динамическая цель выполняется для ${DOCKER_PHP_CONTAINER_NAME}"

call/${DOCKER_NGINX_CONTAINER_NAME}/a: ## NGINX // Динамическая помощь.
    @echo "Динамическая цель выполняется для ${DOCKER_NGINX_CONTAINER_NAME}"

call/bpro_php/b: ## Фиксированная помощь.
    @echo "Фиксированная цель выполняется..."

Объяснение изменений:

  1. Использование ENVIRON: Внутри awk появилась возможность использовать переменную ENVIRON, которая содержит все переменные окружения, включая те, что загружены из .env. Это позволяет сделать замены более универсальными.

  2. Обработка целевых пунктов: При переборе всех целевых пунктов, для каждого имени цели производится замена переменных. Это достигается использованием цикла for, который проходит по всем переменным окружения и заменяет их значение в имени цели.

  3. Форматирование: Я немного изменил форматирование сообщения для отображения, чтобы улучшить читаемость.

Примечание:

  1. Проверьте, что переменные корректно загружаются из .env: Убедитесь, что файл .env находится в той же директории, где выполняется команда make, и что все переменные указаны в правильном формате.

  2. Проверка переменных: Если переменные не заменяются, проверьте, правильно ли они объявлены в .env и отслеживайте возможные ошибки в их определении.

После внесения этих изменений, вызов команды make help должен вернуть список целевых пунктов с корректно интерпретированными переменными.

Оцените материал
Добавить комментарий

Капча загружается...