我有一个失败的简单构建目标,例如
prod:
packr
mkdir -p build/public
cp -r client/public/* build/public/
minify -o build/public/index.html client/public/index.html
minify -o build/public/app.js client/public/app.js
minify -o build/public/normalize.css client/public/normalize.css
gump patch -m "new release!"
$(eval TAG=$(shell git tag -l --sort -version:refname | head -n 1))
packr build -o build/pm -ldflags "-X main.Version=prod -X main.Tag=$(TAG)"
rm -fr build/public
我特别对这三行有疑问
gump patch -m "new release!"
$(eval TAG=$(shell git tag -l --sort -version:refname | head -n 1))
packr build -o build/pm -ldflags "-X main.Version=prod -X main.Tag=$(TAG)"
以纯文本格式,它会颠倒GIT标签,获取最新版本,进行构建。
但是由于某种原因我还不了解,Makefile
分配了TAG = tagref-1,换句话说,分配的是以前的版本,而不是新建的版本。
它的行为就像在发生碰撞之前设置了变量一样。
我希望TAG分配获得使用上一个凹凸命令创建的最后一个标签号。
答案 0 :(得分:1)
在规则的配方中很少使用make
函数。问题(除了该函数不能移植到GNU以外的make
之外)是,当make
读取文件时,这些函数会在上执行,而在食谱中使用它们的人们往往会在配方运行时寻找要执行的命令。在某些情况下没有什么不同,但您不是其中一种。
尚不清楚通过将新标签分配给make
变量而不是直接使用它来寻求什么优势:
gump patch -m "new release!"
packr build -o build/pm -ldflags \
"-X main.Version=prod -X main.Tag=$$(git tag -l --sort -version:refname | head -n 1)"
在另一种方法中,确定当前标记将由外壳程序在处理packr
命令时执行,因此它将获得该时间的版本。
如果您还需要将该标签用于其他地方,那么最好的选择可能是:
阅读原始版本并预测新版本,也许是这样的:
TAG = $(shell expr $$(git tag -l --sort -version:refname | head -n 1) + 1)
添加一个新目标以包含计算出的版本,并建立一条规则,并将其集成到您的构建中
在每次需要时重新确定标签(仅在第一次碰撞时)