求助:编写可动态适配多目录的Go文件构建Makefile
动态编译并打包Lambda Go项目的Makefile方案
需求回顾
- 自动适配
lambdas目录下的子目录增减,无需修改Makefile - 子目录下的Go文件名可以和目录名不一致
- 编译生成的二进制文件输出到对应子目录,后续将二进制打包成
function.zip
完整Makefile代码
# 自动获取lambdas目录下的所有子目录 LAMBDA_DIRS := $(wildcard lambdas/*/) # 遍历子目录,收集所有.go文件(假设每个子目录仅一个.go文件) GO_FILES := $(foreach dir,$(LAMBDA_DIRS),$(wildcard $(dir)*.go)) # 生成对应二进制文件路径:去掉.go后缀 BINARY_FILES := $(GO_FILES:.go=) # 生成对应zip包路径:每个子目录下的function.zip ZIP_FILES := $(foreach bin,$(BINARY_FILES),$(dir $(bin))function.zip) # 默认目标:先编译再打包 all: build zip # 编译所有二进制文件 build: $(BINARY_FILES) # 二进制文件的编译规则:每个.go文件对应生成同名二进制 $(BINARY_FILES): %: %.go GOOS=linux go build -o $@ $< # 打包所有二进制为zip zip: $(ZIP_FILES) # zip包的生成规则:进入子目录执行打包命令,避免路径混乱 $(ZIP_FILES): %.zip: % cd $(dir $@) && zip $(notdir $@) $(notdir $<) # 清理生成的二进制和zip包 clean: rm -f $(BINARY_FILES) $(ZIP_FILES)
代码解释
1. 动态文件/目录匹配
LAMBDA_DIRS := $(wildcard lambdas/*/):自动扫描lambdas下的所有子目录,子目录增减时无需修改代码GO_FILES:遍历每个子目录,抓取其中的Go文件(适配单个子目录一个Go文件的场景)BINARY_FILES:通过替换.go后缀,直接生成对应二进制文件的路径ZIP_FILES:基于二进制文件的目录,生成每个子目录下的function.zip路径
2. 核心构建规则
all: build zip:执行make时默认完成编译+打包全流程$(BINARY_FILES): %: %.go:模式匹配规则,自动为每个Go文件生成编译命令($@代表目标二进制文件,$<代表源Go文件)$(ZIP_FILES): %.zip: %:针对每个二进制文件,进入对应子目录执行zip打包,避免跨目录路径问题
3. 辅助命令
make build:仅编译所有二进制文件,不执行打包make zip:仅对已编译的二进制文件打包make clean:一键清理所有生成的二进制和zip包,方便重新构建
使用方法
- 将上述代码保存为
Makefile放在项目根目录 - 执行
make即可完成全部编译和打包操作 - 根据需要单独执行
make build/make zip/make clean
内容的提问来源于stack exchange,提问作者jerfp
相关产品推荐
相关产品推荐

