估计不同步执行?

时间:2019-05-21 21:16:42

标签: 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/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分配获得使用上一个凹凸命令创建的最后一个标签号。

1 个答案:

答案 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)
    
  • 添加一个新目标以包含计算出的版本,并建立一条规则,并将其集成到您的构建中

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