堆叠或追加 Makefile 目标
Stack or append Makefile targets
我构建了以下 Makefile
来稍微自动化 Docker(减少记忆和输入长命令)。
.PHONY: help build rebuild up down start stop destroy restart enter ps enable-xdebug disable-xdebug
COMPOSE_FILE = docker-compose.yml
PROJECT = my_project
help: ## Show the available commands.
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "3[36m%-30s3[0m %s\n", $, $}' $(MAKEFILE_LIST)
build: ## Build docker images
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) build --parallel --pull
rebuild: ## Force rebuild of docker images from scratch
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) build --parallel --pull --no-cache
up: ## Build and start docker containers
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) up -d
start: ## Start docker containers
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) start
down: ## Remove docker containers
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) down
stop: ## Stop docker containers
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) stop
restart: stop up ## Restart docker containers
(我包含了 restart
目标来演示触发其他目标的 Makefile 目标。)
现在,我遇到的问题是我必须对目标 make build
所做的每项更改也需要在 make rebuild
中进行更改(他们'本质上是相同的命令,减去 --no-cache
标志。)
问题是:有没有办法让 rebuild
调用现有的 build
目标 + 追加 --no-cache
?
所以它看起来像
build: ## Build docker images
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) build --parallel --pull
rebuild: ## Force rebuild of docker images from scratch
${build} --no-cache
你可以把命令放在一个变量里;大多数 makefile 都广泛使用变量,因此可以在一个地方进行更改:
DOCKER_COMPOSE = docker-compose
DOCKER_CMD = $(DOCKER_COMPOSE) -p $(PROJECT) -f $(COMPOSE_FILE)
然后在您的所有食谱中使用 $(DOCKER_CMD)
。那么:
DOCKER_BUILD = $(DOCKER_CMD) build --parallel --pull
build:
$(DOCKER_BUILD)
rebuild:
$(DOCKER_BUILD) --no-cache
或者,您可以使用 target-specific variables 这样做:
NO_CACHE =
DOCKER_BUILD = $(DOCKER_CMD) build --parallel --pull $(NO_CACHE)
build:
$(DOCKER_BUILD)
rebuild: build
rebuild: NO_CACHE = --no-cache
我构建了以下 Makefile
来稍微自动化 Docker(减少记忆和输入长命令)。
.PHONY: help build rebuild up down start stop destroy restart enter ps enable-xdebug disable-xdebug
COMPOSE_FILE = docker-compose.yml
PROJECT = my_project
help: ## Show the available commands.
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "3[36m%-30s3[0m %s\n", $, $}' $(MAKEFILE_LIST)
build: ## Build docker images
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) build --parallel --pull
rebuild: ## Force rebuild of docker images from scratch
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) build --parallel --pull --no-cache
up: ## Build and start docker containers
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) up -d
start: ## Start docker containers
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) start
down: ## Remove docker containers
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) down
stop: ## Stop docker containers
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) stop
restart: stop up ## Restart docker containers
(我包含了 restart
目标来演示触发其他目标的 Makefile 目标。)
现在,我遇到的问题是我必须对目标 make build
所做的每项更改也需要在 make rebuild
中进行更改(他们'本质上是相同的命令,减去 --no-cache
标志。)
问题是:有没有办法让 rebuild
调用现有的 build
目标 + 追加 --no-cache
?
所以它看起来像
build: ## Build docker images
docker-compose -p $(PROJECT) -f $(COMPOSE_FILE) build --parallel --pull
rebuild: ## Force rebuild of docker images from scratch
${build} --no-cache
你可以把命令放在一个变量里;大多数 makefile 都广泛使用变量,因此可以在一个地方进行更改:
DOCKER_COMPOSE = docker-compose
DOCKER_CMD = $(DOCKER_COMPOSE) -p $(PROJECT) -f $(COMPOSE_FILE)
然后在您的所有食谱中使用 $(DOCKER_CMD)
。那么:
DOCKER_BUILD = $(DOCKER_CMD) build --parallel --pull
build:
$(DOCKER_BUILD)
rebuild:
$(DOCKER_BUILD) --no-cache
或者,您可以使用 target-specific variables 这样做:
NO_CACHE =
DOCKER_BUILD = $(DOCKER_CMD) build --parallel --pull $(NO_CACHE)
build:
$(DOCKER_BUILD)
rebuild: build
rebuild: NO_CACHE = --no-cache