Я хотел бы создать несколько каталогов с несколькими файлами с одним make-файлом.
У меня есть такая структура каталогов:
conf_a/conf.json
conf_b/conf.json
main.py
Makefile
requirements.txt
И хотел бы набрать make conf_a
и иметь новый каталог, подобный этому:
build/conf_a/conf.json
build/conf_a/main.py
build/conf_a/requirements.txt
conf_a/conf.json
conf_b/conf.json
main.py
Makefile
requirements.txt
Или что-то вроде make conf_b
и с таким новым каталогом:
build/conf_b/conf.json
build/conf_b/main.py
build/conf_b/requirements.txt
conf_a/conf.json
conf_b/conf.json
main.py
Makefile
requirements.txt
Итак, я сделал Makefile так:
# Disable built-in rules and variables
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --no-builtin-variables
.ONESHELL:
.SHELLFLAGS: -ec
.SILENT:
BUILD_DIR := $(CURDIR)/build
CONF_FILE := conf.json
FILES_TO_COPY := requirements.txt main.py
FUNCTION_DIRS := $(shell ls */$(CONF_FILE) | xargs -n 1 -I {} dirname {})
HIDDEN_FUNCTION_DIRS := $(shell ls .*/$(CONF_FILE) 2> /dev/null | xargs -n 1 -I {} dirname {})
clean:
rm -rf $(BUILD_DIR)
all: clean $(FUNCTION_DIRS) deploy
$(FUNCTION_DIRS) $(HIDDEN_FUNCTION_DIRS):
tmp=$@
FUNCTION_DIR=$${tmp%/}
export FUNCTION=$${FUNCTION_DIR#.}
mkdir -p $(BUILD_DIR)/$$FUNCTION
cp -f $(FILES_TO_COPY) $$FUNCTION_DIR/$(CONF_FILE) $(BUILD_DIR)/$$FUNCTION/
test:
for FUNCTION in $(shell ls $(BUILD_DIR))
do
echo "Testing $$FUNCTION"
done
deploy:
for FUNCTION in $(shell ls $(BUILD_DIR))
do
echo "Deploying $$FUNCTION"
done
Ну, это работает ...
Поэтому, если я хочу проверить настройку, я делаю: make conf_a test
.
Если я хочу развернуть: make conf_b deploy
Работает тихо, но цель test
или deploy
является последовательной (потому что цикл for) и могла бы быть параллельной.
Моя проблема в том, что у меня слишком много конфигурационных каталогов, и поскольку развертывание медленное, параллельное развертывание могло бы быть намного лучше.
Но я не знаю, как структурировать Makefile
, чтобы сделать это таким образом.
Есть идеи?
По правде говоря, задача deploy
развернуть облачную функцию GCP, а test
просто запустить функцию локально