如何实现目录无变更时Makefile不重新构建项目?
问题解决方法
问题根源
- 依赖匹配范围不足:当前
ts/*仅能匹配ts目录下的直接文件,无法覆盖子目录中的源码文件,导致子目录文件变更时Makefile无法检测到;同时遗漏了tsconfig.json,配置文件修改后也应该触发重新构建。 - 目标文件与编译输出不匹配:你的
tsconfig.json指定输出为../target/js/build.js,但Makefile的目标是target/js/bundle.js,两者路径不一致,Makefile会判定目标文件始终不存在,因此每次都会执行编译操作。
修正步骤
1. 调整TypeScript配置文件
如果确实需要输出bundle.js,修改ts/tsconfig.json的outFile路径:
{ "compilerOptions": { "outFile": "../target/js/bundle.js" } }
2. 修正Makefile
# 递归获取ts目录下所有.ts源码文件 TS_SOURCES := $(shell find ts -name "*.ts") # 加入配置文件作为依赖 TS_CONFIG := ts/tsconfig.json target/js/bundle.js: $(TS_SOURCES) $(TS_CONFIG) cd ts && tsc clean: rm -r target
说明
$(shell find ts -name "*.ts"):通过find命令递归遍历ts目录及其子目录,获取所有.ts文件作为依赖,确保任何子目录的文件变更都能触发构建。- 将
tsconfig.json加入依赖:当配置文件修改时,会自动触发重新编译,保证编译逻辑与配置同步。 - 确保
tsconfig.json的outFile路径与Makefile目标文件完全一致,这样Makefile能通过文件时间戳正确判断目标文件是否为最新版本。
内容的提问来源于stack exchange,提问作者nik0x1
相关产品推荐
相关产品推荐

