xhy_0707头像
关注
AI 搜代码会不会钻进 node_modules?WES Code 的搜索忽略规则(附实测)封面图

AI 搜代码会不会钻进 node_modules?WES Code 的搜索忽略规则(附实测)


让 AI 在项目里搜一个函数名,最怕结果一大半来自 node_modules、vendor 或者打包产物。这些结果不光占上下文,还容易把它带偏,跑去改第三方库里的同名函数。

WES Code 的 grep 和 glob 往下遍历目录时,会跳过一张固定名单里的目录。这篇讲名单里有哪些、搜索的参数和上限,附一次在模拟项目上的实测,以及几个容易踩的坑。


一、跳过哪些目录

grep(按内容搜)和 glob(按文件名找)往下走目录时,遇到下面这些名字,整个目录跳过:

类别目录名
版本控制.git、.hg、.svn
依赖node_modules、vendor、.venv、venv、.eggs
构建产物dist、build、target、.next、.nuxt、coverage、.gradle、.terraform
缓存.cache、__pycache__、.tox、.mypy_cache、.pytest_cache、.ruff_cache
编辑器.idea、.vscode

名单里一共 27 个名字,另外三个是 .DS_Store、*.egg-info 和一个写文件时用的临时前缀,*.egg-info 的情况第四节会说。

比对的是目录名本身,在哪一层都算:src/build、packages/web/dist 一样会被跳过。


二、搜索的参数和上限

grep 的参数,举个例子:

{
  "pattern": "func PlaceOrder",
  "path": "internal",
  "glob": "*.go",
  "case_insensitive": false,
  "context_lines": 2,
  "max_results": 50
}
参数作用
pattern正则表达式,必填
path从哪个目录或文件开始搜
glob只搜文件名匹配的,比如 *.go、**/*.md
case_insensitive忽略大小写
context_lines每条匹配前后各带几行
max_results最多返回几条,默认 200

glob 只有 pattern、path、max_results 三个参数,支持 *、?、**,默认最多返回 200 个路径。

超过上限时,结果末尾会写「output truncated at 200 matches」(glob 写的是 paths),AI 就知道结果不全,可以缩小范围再搜。


三、实测:一个模拟项目

我把这份跳过名单的代码原样拿出来,搭了一个模拟项目,按 grep、glob 的遍历方式走了一遍:

func walk(root, base string) []string {
	var found []string
	filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return nil
		}
		if d.IsDir() {
			return builtin.ShouldSkipDir(path, d) // WES Code 的跳过规则,原样复制
		}
		rel, _ := filepath.Rel(base, path)
		found = append(found, rel)
		return nil
	})
	return found
}

func main() {
	proj, _ := os.MkdirTemp("", "proj")
	for _, f := range []string{
		"main.go",
		"internal/order/order.go",
		"internal/build/version.go",
		"node_modules/lodash/index.js",
		"node_modules/lodash/dist/lodash.min.js",
		"vendor/foo/foo.go",
		"dist/app.js",
		".venv/lib/site.py",
		".github/workflows/ci.yml",
		"mypkg.egg-info/PKG-INFO",
		".vscode/settings.json",
	} {
		p := filepath.Join(proj, f)
		os.MkdirAll(filepath.Dir(p), 0o755)
		os.WriteFile(p, []byte("x\n"), 0o644)
	}
	fmt.Println("从项目根目录搜:", strings.Join(walk(proj, proj), "  "))
	fmt.Println("指定搜 node_modules:", walk(filepath.Join(proj, "node_modules"), proj))
	fmt.Println("指定搜 node_modules/lodash:", walk(filepath.Join(proj, "node_modules", "lodash"), proj))
}

项目里一共 11 个文件,结果:

从哪搜搜到的文件
项目根目录main.go、internal/order/order.go、.github/workflows/ci.yml、mypkg.egg-info/PKG-INFO
直接指定 node_modules一个也没有
指定 node_modules/lodashnode_modules/lodash/index.js

node_modules、vendor、dist、.venv、.vscode 都按预期跳过了。但有几个结果值得单独说:

  • internal/build/version.go 没搜到:这是自己写的代码,只因为目录叫 build,整个被跳过
  • .github/workflows/ci.yml 搜到了:.github 不在名单里。隐藏目录不会因为名字带点就被跳过
  • mypkg.egg-info/PKG-INFO 搜到了:名单里写的是 *.egg-info,但比对是拿目录名原样去比,mypkg.egg-info 对不上
  • 直接指定 node_modules 搜不到:起点目录本身也要过一遍名单,名字对上了就直接跳过。指定到某个包目录就可以,包里的 dist 照样跳过

四、它不做的事

  • 不看 .gitignore:只认这张固定名单,项目自己的 .gitignore 不起作用。生成的代码要是放在 gen、out 这种不在名单里的目录,照样会被搜进来
  • 名单改不了:名单写在代码里,目前没有配置项可以增减
  • 通用名字会误伤:代码目录叫 build、dist、target、coverage 的,会被整个跳过,就像实测里的 internal/build
  • *.egg-info 实际不生效:Python 项目里的 xxx.egg-info 目录还是会被搜到
  • 想搜依赖里的代码,要指到包目录:直接指定 node_modules 什么都搜不到,得写到 node_modules/某个包
  • 一次最多 200 条:结果多了会截断,要用 glob、path 缩小范围

小结

  1. grep、glob 遍历时跳过 27 个固定的目录名,包括依赖、构建产物、缓存、版本控制和编辑器目录
  2. 按目录名比对,在哪一层都算,起点目录本身也算
  3. grep 支持正则、文件名过滤、忽略大小写和上下文行;两者默认最多返回 200 条,超了会写明截断
  4. 不看 .gitignore;叫 build、dist 的代码目录也会被跳过;.github 这类不在名单里的隐藏目录照样会搜

文中的搜索忽略规则是 WES Code 里的功能,官网是 weisyn.com。你们项目里有没有名字容易被误伤的目录,或者希望它也跳过的目录,欢迎评论区聊聊。

觉得有用的朋友,欢迎点赞、收藏、关注,后面会继续分享 AI 编程的实战经验。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/xhy_mmc/article/details/167577617

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--