Makefile在每次生成时增加变量



我有一个带有变量DOCKER_TAG = 0.0.1的makefile

我希望在每个被调用的目标上,它都会被碰撞(只有补丁版本(,这可能是吗

例如

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 := ..

最好使用一些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)前面的-以获得错误。最后一个是我最喜欢的。

相关内容

  • 没有找到相关文章

最新更新