请考虑以下makefile片段:
COMMIT := $(shell git rev-parse HEAD)
build:
docker build -f Dockerfile --no-cache=false -t $(COMMIT) .
rebuild:
docker build -f Dockerfile --no-cache=true -t $(COMMIT) .
Run Code Online (Sandbox Code Playgroud)
build和之间唯一的区别rebuild是--no-cache参数的值.显然,略微改变重写相同的命令是一种不好的做法; 它打破了DRY原则,如果我需要更改命令中的其他内容 - 例如,值的-t- 我将不得不在所有相关目标中更改它.
我有这样的想法:
COMMIT := $(shell git rev-parse HEAD)
NO_CACHE := false
build:
docker build -f Dockerfile --no-cache=$(NO_CACHE) -t $(COMMIT) .
rebuild:
NO-CACHE = true
make build
Run Code Online (Sandbox Code Playgroud)
我试着玩变量,没有运气.
docker build一次编写命令并让每个目标改变其参数的优雅方法是什么?
您可以使用构造的变量名称:
COMMIT := $(shell git rev-parse HEAD)
build_NOCACHE = false
rebuild_NOCACHE = true
build rebuild:
docker build -f Dockerfile --no-cache=$($@_NOCACHE) -t $(COMMIT) .
Run Code Online (Sandbox Code Playgroud)
或者您可以使用特定于目标的变量:
COMMIT := $(shell git rev-parse HEAD)
build: NOCACHE = false
rebuild: NOCACHE = true
build rebuild:
docker build -f Dockerfile --no-cache=$(NOCACHE) -t $(COMMIT) .
Run Code Online (Sandbox Code Playgroud)