如何在Makefile中实现多目录test与deploy任务的并行执行?
解决方案
要实现test和deploy任务的并行执行,核心是把原来串行的Shell循环拆成Make的独立子目标,利用Make本身的并行任务调度能力(通过-j参数控制并行数)。下面是修改后的完整Makefile,以及关键改动的说明:
修改后的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) 2> /dev/null | xargs -n 1 -I {} dirname {}) HIDDEN_FUNCTION_DIRS := $(shell ls .*/$(CONF_FILE) 2> /dev/null | xargs -n 1 -I {} dirname {}) FUNCTIONS := $(foreach dir,$(FUNCTION_DIRS) $(HIDDEN_FUNCTION_DIRS),$(patsubst .%,%,$(dir))) # 生成每个函数对应的测试、部署子目标 TEST_TARGETS := $(addprefix test-,$(FUNCTIONS)) DEPLOY_TARGETS := $(addprefix deploy-,$(FUNCTIONS)) 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/ # 总测试目标:依赖所有函数的测试子目标 .PHONY: test $(TEST_TARGETS) test: $(TEST_TARGETS) # 单个函数的测试规则(模式匹配) test-%: echo "Testing $*" # 替换为实际的测试命令,比如本地运行函数: # cd $(BUILD_DIR)/$* && python main.py # 总部署目标:依赖所有函数的部署子目标 .PHONY: deploy $(DEPLOY_TARGETS) deploy: $(DEPLOY_TARGETS) # 单个函数的部署规则(模式匹配) deploy-%: echo "Deploying $*" # 替换为实际的GCP部署命令,比如: # gcloud functions deploy $* --runtime python311 --trigger-http --source $(BUILD_DIR)/$*
关键改动说明
提取函数名列表
我们从配置目录中生成了纯净的函数名列表FUNCTIONS,去掉了隐藏目录的前缀点(比如.conf_a转为conf_a),方便后续生成子目标。拆分独立子目标
通过addprefix生成每个函数对应的测试目标(如test-conf_a)和部署目标(如deploy-conf_a),让Make可以单独调度每个任务。模式规则复用逻辑
使用Make的模式规则(test-%和deploy-%)来统一处理所有函数的测试/部署逻辑,避免为每个函数重复写规则。其中$*会自动匹配目标中的函数名(比如test-conf_a中的conf_a)。标记伪目标
用.PHONY标记test、deploy以及所有子目标,告诉Make这些不是实际的文件,每次都需要执行。
并行执行方式
执行时通过-j参数指定并行任务数(比如-j4表示同时运行4个任务):
# 并行测试所有函数 make -j4 test # 并行部署所有函数 make -j4 deploy # 也可以结合其他目标,比如先构建再并行部署 make -j8 all
这样Make会自动调度所有子任务并行执行,大幅提升多配置目录下的测试/部署效率,尤其适合GCP Cloud Function这类网络耗时较长的操作。
内容的提问来源于stack exchange,提问作者Djabx
相关产品推荐
相关产品推荐

