首页 > 解决方案 > Makefile 在每次构建时增加变量

问题描述

我有一个带有变量的makefileDOCKER_TAG = 0.0.1

我希望在每个被调用的目标上都会碰到它(只有补丁版本)是否有可能

例如

DOCKER_TAG = 0.0.1

push: 
    docker push docker.io/testasm:$(DOCKER_TAG)

现在如果我运行make push它将使用版本0.0.1,但如果我第二次这样做,它将被撞到0.0.2等等(在每次运行时make push),这可能吗?

更新我尝试了以下

DOCKER_TAG = 0.0.1
DOCKER_REGISTRY = testreg/vsp


VERSION_FILE   := version.txt
-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))

DOCKER_TAG     := $(shell [ -f "$(VERSION_FILE)" ] && cat "$(VERSION_FILE)" || echo '0.0.1')
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)



NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)


build:
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

并且version.txt文件得到..两个点的值......知道如何解决它吗?

如果我按原样选择答案的最后一个选项, 我会看到该version.txt文件包含DOCKER_TAG := ..

更新 2

我创建了空的 version.txt 文件并按原样使用以下内容

VERSION_FILE   := version.txt
DOCKER_TAG     := 0.0.1.

-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))

NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)
build:
    docker build -t docker.io/vcd/test:$(DOCKER_TAG) .
    echo "DOCKER_TAG := $(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

我在 version.txt 文件中得到了以下内容DOCKER_TAG := ..

标签: bashshellmakefilegnu-make

解决方案


最好的办法是使用一些 docker 命令(docker search?)来查询存储库并从那里获取最新版本。如果不可能,您可以将其存储在文本文件中,每次运行 make 时读取并更新它。就像是:

VERSION_FILE   := version.txt
DOCKER_TAG     := $(shell [ -f "$(VERSION_FILE)" ] && cat "$(VERSION_FILE)" || echo '0.0.1')
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

当然,您必须照顾好您的版本文件并避免意外删除。为了更高的安全性,您可以自己编写第一个版本文件并指示 make 在文件不存在的情况下引发错误:

VERSION_FILE   := version.txt

ifneq ($(wildcard $(VERSION_FILE)),$(VERSION_FILE))

$(error $(VERSION_FILE) not found)

else

DOCKER_TAG     := $(shell cat "$(VERSION_FILE)")
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

endif

版本文件本身是主文件包含的 Makefile 的变体:

VERSION_FILE   := version.txt
DOCKER_TAG     := 0.0.1

-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "DOCKER_TAG := $(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

(如果文件不存在,删除-前面的会出错。最后一个是我最喜欢的。-include $(VERSION_FILE)


推荐阅读