Makefile疑问:依赖.env的目标为何每次执行make都会运行?
问题原因及解决方法
你的问题出在:echo这个目标没有对应的实际文件。Make的工作逻辑是对比目标文件和依赖文件的时间戳,如果目标文件不存在,它会默认认为这个目标需要被重建,所以每次执行make都会跑对应的命令。
给你两个解决思路:
思路一:让目标生成实际文件
修改Makefile,在命令里新增touch echo来生成目标文件,这样Make会自动对比echo和.env的时间戳,只有.env更新时才会重新执行:
echo: .env @echo "ENV CHANGED" @touch echo
思路二:用伪目标+时间戳文件判断
如果不需要生成echo文件,可以把echo声明为伪目标,同时用一个临时文件记录上次执行的时间,手动判断.env是否更新:
.PHONY: echo echo: @if [ .env -nt .echo_timestamp ]; then \ echo "ENV CHANGED"; \ touch .echo_timestamp; \ fi
这里.echo_timestamp是用来记录上次执行命令的时间,每次执行make echo时,会检查.env是否比.echo_timestamp新,是的话才输出内容并更新时间戳。
内容的提问来源于stack exchange,提问作者Bhautik Chudasama
相关产品推荐
相关产品推荐

