如何仅在文件缺失或下载URL变更时通过Makefile下载文件?
Makefile实现按需下载(文件缺失/URL变更时触发)
核心思路是用一个戳记文件记录当前使用的下载URL,通过对比戳记内容和当前URL,结合目标文件是否存在,来决定是否重新下载。
完整实现代码
# 自定义配置:替换成你的目标文件和下载地址 TARGET_FILE := my_file.tar.gz DOWNLOAD_URL := https://example.com/resources/my_file.tar.gz # 自动生成戳记文件名,和目标文件绑定 URL_STAMP := $(TARGET_FILE).url.stamp # 默认执行目标 all: $(TARGET_FILE) # 目标文件依赖戳记文件——戳记更新则重新下载 $(TARGET_FILE): $(URL_STAMP) # 这里可以替换成curl:curl -o $@ $(DOWNLOAD_URL) wget -O $@ $(DOWNLOAD_URL) # 戳记文件规则:检查URL是否变化,变化则更新戳记 $(URL_STAMP): @if [ ! -f $@ ] || [ "$$(cat $@)" != "$(DOWNLOAD_URL)" ]; then \ echo "$(DOWNLOAD_URL)" > $@; \ fi # 清理生成的文件 clean: rm -f $(TARGET_FILE) $(URL_STAMP)
逻辑说明
- 戳记文件的作用:
$(URL_STAMP)保存当前生效的下载URL,每次Make执行时都会检查它 - 触发下载的条件:
- 目标文件
$(TARGET_FILE)不存在 - 戳记文件不存在(首次执行)
- 戳记文件里的URL和
DOWNLOAD_URL不一致(URL更新)
- 目标文件
- 自动更新戳记:当URL变化时,戳记文件会被重新写入新的URL,触发后续的下载动作
可选优化
- 如果需要校验文件完整性,可以把文件哈希值也加入戳记文件,比如:
# 新增哈希校验 EXPECTED_HASH := "abc123def456..." $(URL_STAMP): @if [ ! -f $@ ] || [ "$$(head -n1 $@)" != "$(DOWNLOAD_URL)" ] || [ "$$(tail -n1 $@)" != "$(EXPECTED_HASH)" ]; then \ echo "$(DOWNLOAD_URL)" > $@; \ echo "$(EXPECTED_HASH)" >> $@; \ fi $(TARGET_FILE): $(URL_STAMP) wget -O $@ $(DOWNLOAD_URL) echo "$(EXPECTED_HASH) $@" | md5sum -c - - 替换下载工具:把
wget换成curl只需修改下载命令即可
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

