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

求助:编写可动态适配多目录的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包,方便重新构建

使用方法

  1. 将上述代码保存为Makefile放在项目根目录
  2. 执行make即可完成全部编译和打包操作
  3. 根据需要单独执行make build/make zip/make clean

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:55:24