Makefile:比较来自 git 标记和 package.json 的两个版本字符串值

Makefile: compare two version string values from git tag and package.json

我正在尝试比较 pacakge.json 最新 git 标记之间的版本值,以便在版本不匹配时我可以使 CI 构建失败。我创建了一个 make 目标,它将采用两个版本值并进行字符串比较以确保它们相同,尽管如果可能的话我愿意接受数字比较。

PKG_VERSION=$(shell echo v$$(jq .version package.json))
LATEST_TAG=$(shell git describe --tags --abbrev=0 $$(git rev-list --tags --max-count=1))
enforce-versions:
    @echo "Comparing \"$(PKG_VERSION)\" & \"$(LATEST_TAG)\""
ifeq ($(PKG_VERSION), $(LATEST_TAG))
    exit 0;
else
    exit 1;
endif

输出:

$ make enforce-versions 
Comparing "v1.0.0" & "v1.1.0"
exit 1;
make: *** [enforce-versions] Error 1
$ make enforce-versions
Comparing "v1.1.0" & "v1.1.0"
exit 1;
make: *** [enforce-versions] Error 1

您可以尝试删除 \r:

PKG_VERSION=$(shell echo v$$(jq .version package.json | tr -d $$\'\r\'))

您可能还需要将管道应用于 LATEST_TAG。

您可以在 shell 命令中进行比较,而不是像这样在 ifeq 内部进行比较:

PKG_VERSION=$(shell echo v$$(jq .version package.json))
LATEST_TAG=$(shell git describe --tags --abbrev=0 $$(git rev-list --tags --max-count=1))
enforce-versions:
    @echo "Comparing \"$(PKG_VERSION)\" & \"$(LATEST_TAG)\""
    @[ "$(PKG_VERSION)" = "$(LATEST_TAG)" ]

请注意,在这种情况下您不需要明确的 exit 0exit 1。如果标签不相等,该命令将 return false,这将导致 make 使配方行失败,并且 return 1