如何用GNU Make获取可测试Go包列表?patsubst多%问题
用GNU Make获取符合要求的Go可测试包列表
当然可以实现,你之前的代码问题在于:会把所有子目录下的_test.go文件都对应到所属目录,不管文件名前缀是否和目录名一致,而且没有做去重处理,所以不符合你的需求。下面给两种可行的实现方式:
方式一:结合Shell命令实现(简单直观)
直接用find和awk筛选出符合条件的目录,再去重:
packages := $(shell find . -maxdepth 2 -type f -name "*_test.go" | awk -F/ '{dir=$$2; file=$$3; if (file == dir "_test.go") print dir}' | sort -u)
逻辑说明:
find仅查找当前目录直接子目录下的_test.go文件(深度限制为2,避免递归到更深目录)awk分割文件路径,直接判断文件名是否严格等于目录名_test.go,符合条件就输出目录名sort -u对结果去重,避免同一个目录因多个测试文件重复出现
方式二:纯Make函数实现(不依赖Shell)
如果想完全用Make内置函数实现,不用调用Shell命令,可以这样写:
# 先获取所有直接子目录下的_test.go文件 test_files := $(wildcard */*_test.go) # 遍历每个测试文件,筛选出符合条件的目录并去重 packages := $(sort $(foreach file,$(test_files),\ $(eval dir_name=$(patsubst %/,%,$(dir $(file))))\ $(eval file_name=$(notdir $(file)))\ $(if $(filter $(dir_name)_test.go,$(file_name)),$(dir_name))\ ))
逻辑说明:
dir $(file)提取文件所在目录(比如foo/),patsubst %/,%,...去掉末尾斜杠得到纯目录名foonotdir $(file)提取文件名(比如foo_test.go)- 直接判断文件名是否等于
目录名_test.go,符合条件就将目录名加入列表,最后用sort去重
这样就能精准获取所有包含目录名_test.go文件的Go包目录了。
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

