执行过程中多次调用先决条件
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 lint
和 npm 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
任务)
我正在使用 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: 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
任务)