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)
    
  • 添加一个新目标以包含计算版本,并添加一个规则以构建它,然后将其集成到构建中

  • 每次需要时重新确定标签(仅在第一次碰撞时)