如何在GNU Make中实现无依赖目标的指定执行顺序?
GNU Make 中非严格依赖的Phony目标顺序控制
我有一些Phony目标,偶尔需要按特定顺序运行,但它们并非严格依赖关系。示例代码如下:
.PHONY: image-build image-build: Dockerfile docker build --tag foobar --file $< . .PHONY: image-tag image-tag: image-build docker tag foobar foobar:latest .PHONY: image-push image-push: docker push foobar:latest
我的需求很明确:
- 单独执行
make image-push时,不要自动触发image-tag的执行 - 同时执行
make image-tag image-push时,必须保证image-tag先于image-push运行
目前我用了一个临时解决方案:
.PHONY: image-deploy image-deploy: image-tag $(MAKE) image-push
请问能不能在GNU Make中直接实现这种逻辑?
当然可以,GNU Make提供了**仅顺序依赖(Order-Only Prerequisites)**的语法,正好匹配这种“非严格依赖但需保证顺序”的场景,用管道符 | 来定义即可。
修改image-push的规则如下:
.PHONY: image-push image-push: | image-tag docker push foobar:latest
这样就能完美满足需求:
- 单独执行
make image-push时,image-tag作为仅顺序依赖,不会被自动触发,直接执行push命令 - 当你显式同时指定两个目标(比如
make image-tag image-push)时,Make会确保image-tag在image-push之前执行完毕
简单说下仅顺序依赖的特性:它和普通依赖的区别是,不会因为当前目标“过期”就触发前置目标的构建,只有当前置目标本身需要被执行(比如命令行显式指定、或者它的普通依赖过期)时,才会强制保证它的执行顺序在当前目标之前。
内容的提问来源于stack exchange,提问作者shadowtalker
相关产品推荐
相关产品推荐

