Makefile 评估未同步执行?
我有一个失败的简单构建目标,比如Makefile 评估未同步执行?,makefile,Makefile,我有一个失败的简单构建目标,比如 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/normal
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
assigns TAG=tagref-1,换句话说,是以前的版本,而不是新构建的版本
它的行为就好像该变量是在凹凸发生之前设置的
我希望标记分配能够获得使用上一个bump命令创建的最后一个标记号。在规则的配方中使用
make
函数很少合适。问题(除了函数不能移植到GNU以外的make
s之外)在于函数是在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)"
在另一种情况下,当shell处理packr
命令时,确定当前标记会被延迟,因此它将获得当时的版本
如果您也需要在其他地方使用标签,那么您的最佳选择可能是:
- 阅读原始版本并预测新版本,可能是这样的:
TAG = $(shell expr $$(git tag -l --sort -version:refname | head -n 1) + 1)
- 添加一个新目标以包含计算版本,并添加一个规则以构建它,然后将其集成到构建中
- 每次需要时重新确定标签(仅在第一次碰撞时)