bash - 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 := ..
解决方案
最好的办法是使用一些 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)
推荐阅读
- mysql - 如何在特定列的一个查询中更新多行值
- powershell - 如何在 Powershell 控制台中为 PSReadLineOption v2 使用 ANSI 转义序列颜色代码?
- spring - springframework安全找不到UserBuilder
- css - 创建一个可能包含两个或三个元素的相同高度的按钮
- javascript - 如何通过 phonegap 在混合移动应用程序上使用 tawk.to API?
- react-native - 如何在反应原生时更改 SVG 的颜色?
- android - 以编程方式更改约束时,Android MotionLayout 状态未更新
- azure - 无法在 azure 中创建 python 函数
- alexa - 显示接口与 APL
- laravel - 在视图上显示数据时尝试获取非对象的属性“column_name”