执行过程中多次调用先决条件

Call prerequisites multiple times during execution

我正在使用 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 lintnpm run test

但据我观察,这并没有发生,因为 make 考虑了 lint 任务 运行 之后要完成的先决条件,我得到

make: Nothing to be done for 'test'.

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

有没有办法在 Makefile 中解决这个问题,而无需创建 shell 脚本作为中间代理?

无法 make 在一次 make 调用中多次构建相同的目标。这不是它的工作方式:它构建一个东西,然后期望它在该会话的其余部分是最新的。

你可以使用 make 的递归调用来做你想做的事:

.PHONY: lint test exec

lint: CMD := npm run lint
test: CMD := npm run test

lint test:
        $(MAKE) exec CMD=$(CMD)

exec:
        docker-compose exec service ${CMD}

从@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 任务)