首页 > 解决方案 > 在执行期间多次调用先决条件

问题描述

我正在使用 Make 处理项目中的基本任务,并且我的签名中有以下签名Makefile

.PHONY: exec lint test

exec:
    docker-compose exec service ${CMD}

lint: CMD := npm run lint
lint: exec

test: CMD := npm run test
test: exec

当我运行make lint test命令时,我希望它在 Docker 容器中npm run lint和内部运行。npm run test

但正如我观察到的那样,它没有发生,因为make考虑在lint任务运行后完成的先决条件,我得到了

make:“测试”不需要做任何事情。

调用时的消息。从 make 的角度来看,这是完全可以理解的,但这对我的使用来说是一个副作用。

有没有办法在 Makefile 中解决这个问题,而不需要创建一个 shell 脚本来充当中间代理?

标签: makefilegnu-make

解决方案


从@madscientist 获得灵感并深入研究文档后,我发现了我正在寻找的内容:Canned Recipes允许声明要在多个任务(食谱)中重用的命令列表。

以下将满足问题中的示例:

.PHONY: exec

define exec =
    docker-compose exec service ${CMD}
endef

lint: CMD := npm run lint
lint:
    $(exec)

test: CMD := npm run test
test:
    $(exec)

虽然@madscientist 的解决方案也可以工作,但我觉得这更好,因为它不会导致递归make调用,并且任务不会分成两部分(分配 CMD 变量并调用exec任务)


推荐阅读