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

如何用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 %/,%,...去掉末尾斜杠得到纯目录名foo
  • notdir $(file)提取文件名(比如foo_test.go)
  • 直接判断文件名是否等于目录名_test.go,符合条件就将目录名加入列表,最后用sort去重

这样就能精准获取所有包含目录名_test.go文件的Go包目录了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:57:24