如何简化Makefile中多Target-specific Variable Values的设置?
简化Make目标特定变量的配置
当然不用逐个重复写目标名来设置变量啦!Make 本身就支持更简洁的语法,能帮你减少冗余代码,同时保持可读性。
1. 同一行批量设置多个目标特定变量
你可以把同一个目标的所有特定变量放在同一行,跟在目标名后面,用空格分隔多个变量赋值即可。比如你的 dev_deploy 和 prod_deploy 可以改成这样:
# 一次性设置dev_deploy的所有目标特定变量 dev_deploy: env = dev image = abc tag = 1.0.4-dev dev_deploy: docker run -t --rm -e env=$(env) \ $(image):$(tag) \ sh -c "test.sh" # 同理处理prod_deploy prod_deploy: env = prod image = abc tag = 1.0.3-prod prod_deploy: docker run -t --rm -e env=$(env) \ $(image):$(tag) \ sh -c "test.sh"
这样就不用重复三次写 dev_deploy: 和 prod_deploy: 了,代码更紧凑。
2. 共享通用命令进一步减少冗余
观察你的代码,dev_deploy 和 prod_deploy 的执行命令完全一样,只是变量值不同。这种情况下,你可以把命令提取出来,让两个目标共享同一个规则,进一步简化:
# 先为每个目标设置专属变量 dev_deploy: env = dev image = abc tag = 1.0.4-dev prod_deploy: env = prod image = abc tag = 1.0.3-prod # 让两个目标共享同一段执行命令 dev_deploy prod_deploy: docker run -t --rm -e env=$(env) \ $(image):$(tag) \ sh -c "test.sh"
这样不仅省去了重复写目标名的麻烦,连重复的命令代码也统一了,后续要修改命令的话,只需要改一处即可,维护起来更方便。
如果你的部署逻辑更复杂,还可以用 define 定义一个命令模板,然后在目标中引用:
# 定义通用部署命令模板 define DEPLOY_TEMPLATE docker run -t --rm -e env=$(env) \ $(image):$(tag) \ sh -c "test.sh" endef # 设置目标变量并引用模板 dev_deploy: env = dev image = abc tag = 1.0.4-dev dev_deploy: $(DEPLOY_TEMPLATE) prod_deploy: env = prod image = abc tag = 1.0.3-prod prod_deploy: $(DEPLOY_TEMPLATE)
这种方式适合逻辑复杂、需要复用多次的场景,可读性和可维护性都更强。
内容的提问来源于stack exchange,提问作者BMW
相关产品推荐
相关产品推荐

