makefile - 在执行期间多次调用先决条件
问题描述
我正在使用 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 脚本来充当中间代理?
解决方案
从@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
任务)
推荐阅读
- c# - 来自其他表的 Automapper 映射 ID
- php - 是否可以使用 php 将文本文件导入到 sqlite 表中?
- r - 将表示数字的字符串值更改为整数值
- javascript - 肥皂客户端可以重试createClient吗?
- python - 如何从linkedin查找日期范围的xpath
- python-3.x - 为什么python中的list可以从np.float64类型中减去而不能使用int类型?
- php - 访问 SimpleSAMLphp 核心登录页面时如何重定向到 authsource 中第一个配置的登录模块?
- ruby-on-rails - 使用 React 设计 Ruby on Rails 应用程序的正确方法是什么
- lua - 我需要在 Lua 中迭代用户数据
- json - 快速解析 Json