堆叠或追加 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