Makefile 在每次构建时增加变量
Makefile increase variable on each build
我有一个带变量的 makefile DOCKER_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 := ..
最好的办法是使用一些 docker 命令 (docker search
?) 查询存储库并从那里获取最新版本。如果不可能,您可以将其存储在文本文件中,每次 运行 时阅读并更新。类似于:
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)
前面的-
去掉,如果文件不存在会报错,最后这个是我最喜欢的
我有一个带变量的 makefile DOCKER_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 := ..
最好的办法是使用一些 docker 命令 (docker search
?) 查询存储库并从那里获取最新版本。如果不可能,您可以将其存储在文本文件中,每次 运行 时阅读并更新。类似于:
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)
前面的-
去掉,如果文件不存在会报错,最后这个是我最喜欢的