You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)/$*

关键改动说明

  1. 提取函数名列表
    我们从配置目录中生成了纯净的函数名列表FUNCTIONS,去掉了隐藏目录的前缀点(比如.conf_a转为conf_a),方便后续生成子目标。

  2. 拆分独立子目标
    通过addprefix生成每个函数对应的测试目标(如test-conf_a)和部署目标(如deploy-conf_a),让Make可以单独调度每个任务。

  3. 模式规则复用逻辑
    使用Make的模式规则(test-%和deploy-%)来统一处理所有函数的测试/部署逻辑,避免为每个函数重复写规则。其中$*会自动匹配目标中的函数名(比如test-conf_a中的conf_a)。

  4. 标记伪目标
    用.PHONY标记test、deploy以及所有子目标,告诉Make这些不是实际的文件,每次都需要执行。

并行执行方式

执行时通过-j参数指定并行任务数(比如-j4表示同时运行4个任务):

# 并行测试所有函数
make -j4 test

# 并行部署所有函数
make -j4 deploy

# 也可以结合其他目标,比如先构建再并行部署
make -j8 all

这样Make会自动调度所有子任务并行执行,大幅提升多配置目录下的测试/部署效率,尤其适合GCP Cloud Function这类网络耗时较长的操作。

内容的提问来源于stack exchange,提问作者Djabx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:42:28