makefile - Makefile 反复制作 .PHONY 目标
问题描述
我有一个看起来像这样的 Makefile:
.PHONY: aws-deps
requirements.txt: Pipfile Pipfile.lock
pipenv lock -r > $@
aws-deps: requirements.txt
pip3 install --upgrade --target aws_src/ -r $<
如果我运行make requirements.txt
不止一次,它会正确地说它是最新的。但是,如果我运行make aws-deps
它的行为与我期望的.PHONY
目标不同,它每次都会运行,无论是否requirements.txt
发生了变化。比如先删除 requirements.txt:
$ make aws-deps
pipenv lock -r > requirements.txt
pip3 install --upgrade --target aws_src/ -r requirements.txt
<snip>
$ make aws-deps
pip3 install --upgrade --target aws_src/ -r requirements.txt
<snip>
我是否误解了.PHONY
deps 的作用?我希望 aws-deps 仅在其先决条件发生变化时才做某事,即我的 requirements.txt 发生了变化——有人知道我在让它工作时缺少什么吗?
谢谢!
解决方案
.PHONY
目标告诉 make 将目标视为不是文件,即使可能存在与该目标具有相同名称的文件。由于此处没有命名文件aws-deps
,.PHONY
因此对您的情况没有实际影响。相反,make 没有任何东西可以比较 to 的时间戳,requirements.txt
并假设规则 foraws-deps
必须运行。您可以通过以下方式更改此行为
AWS_DEP = .aws-deps-done # hidden file to compare a timestamp against
.PHONY: aws-deps
aws-deps: $(AWS_DEP)
$(AWS_DEP): requirements.txt
pip3 install --upgrade --target aws_src/ -r $<
@touch $@
推荐阅读
- javascript - 对象检测不适用于自定义模型
- python-3.x - 将多进程程序的输出通过管道传输到多个文本文件中
- git - 如何显示从上游获取的内容?
- javascript - React:关于使用与框架无关的 util 函数操作 React 状态的问题
- label - TradingView label.new 打印多个柱的问题
- typescript - 如何用笑话模拟 dynamoDB 调用?
- html - 我怎样才能使这部分全屏高度?
- javascript - 如何将在 html 页面上编辑的内容保存到 Google 工作表
- angular - Angular CLI 命令中的 i 是什么:ng gi student?
- android - Diff util 未在回收站视图中更新项目 UI