Вопрос или проблема
Я пытаюсь создать красивую и динамичную помощь, но мне трудно интерпретировать имена переменных в файле .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 "Фиксированная цель выполняется..."
Объяснение изменений:
-
Использование
ENVIRON
: Внутриawk
появилась возможность использовать переменнуюENVIRON
, которая содержит все переменные окружения, включая те, что загружены из.env
. Это позволяет сделать замены более универсальными. -
Обработка целевых пунктов: При переборе всех целевых пунктов, для каждого имени цели производится замена переменных. Это достигается использованием цикла
for
, который проходит по всем переменным окружения и заменяет их значение в имени цели. -
Форматирование: Я немного изменил форматирование сообщения для отображения, чтобы улучшить читаемость.
Примечание:
-
Проверьте, что переменные корректно загружаются из
.env
: Убедитесь, что файл.env
находится в той же директории, где выполняется командаmake
, и что все переменные указаны в правильном формате. -
Проверка переменных: Если переменные не заменяются, проверьте, правильно ли они объявлены в
.env
и отслеживайте возможные ошибки в их определении.
После внесения этих изменений, вызов команды make help
должен вернуть список целевых пунктов с корректно интерпретированными переменными.