如何在目录结构变更时触发Make目标构建
基于状态文件的增量检测方案
利用Makefile的依赖检查机制,结合一个Git忽略的状态文件,就能避免每次都执行耗时的dir.ts脚本,只在目录树真正变化时才重新生成JSON文件。
1. 配置Git忽略状态文件
在项目根目录的.gitignore中添加:
docs/.dir_state
确保这个状态文件不会被提交到仓库。
2. 更新Makefile脚本
修改你的Makefile,加入状态检测逻辑:
TS_NODE := ./docs/node_modules/.bin/ts-node ROOT := $(shell git rev-parse --show-toplevel) # 定义存储目录状态的文件路径 DIR_STATE := ./docs/.dir_state # 生成目录结构JSON的目标,依赖状态文件 dir: $(DIR_STATE) $(TS_NODE) ./docs/dir.ts $(ROOT) > ./docs/dir.json # 生成/更新状态文件:仅当目录树变化时重新计算哈希 $(DIR_STATE): # 通过Git追踪的文件列表计算哈希,作为目录状态标识 git ls-files $(ROOT) | sort | sha256sum > $(DIR_STATE)
核心逻辑解释
- 状态文件
.dir_state:保存当前仓库目录树的哈希值,只有当Git追踪的文件发生增删改时,哈希才会改变。 - Makefile依赖链:
dir目标依赖.dir_state,当哈希变化时,Makefile会自动触发dir目标的命令,重新生成dir.json。 - 自定义监控范围:如果只需要监控特定目录(比如
src/),可以把git ls-files $(ROOT)替换为git ls-files $(ROOT)/src,缩小检测范围提升效率。
非Git场景的替代方案
如果你的目录包含未被Git追踪的文件,可改用find命令遍历目录计算哈希:
$(DIR_STATE): # 排除不需要监控的目录(如node_modules、.git),避免误触发 find $(ROOT) -type f -not -path '*/node_modules/*' -not -path '*/.git/*' | sort | sha256sum > $(DIR_STATE)
内容的提问来源于stack exchange,提问作者jcubic
相关产品推荐
相关产品推荐

