首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >eval是否未同步执行?

eval是否未同步执行?
EN

Stack Overflow用户
提问于 2019-05-22 05:16:42
回答 1查看 25关注 0票数 0

我有一个非常简单的构建目标,比如

代码语言:javascript
复制
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

我特别对这三行有问题。

代码语言:javascript
复制
    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,换句话说,分配的是以前的版本,而不是新构建的版本。

它的行为就像在凹凸发生之前设置了变量一样。

我期望标记赋值会获得使用上一个凹凸命令创建的最后一个标记编号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-22 06:18:27

很少适合在规则的配方中使用make函数。问题是(除了GNU之外,函数不能移植到make)是函数在make读取文件时执行,而在配方中使用它们的人倾向于在配方运行时查找要执行的函数。在某些情况下,这不会有什么不同,但您的情况不在此列。

通过将新标记赋值给make变量而不是直接使用它,还不清楚您在寻求什么好处:

代码语言:javascript
复制
    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命令时执行,因此它将获得当时的版本。

如果您也需要在其他地方使用该标记,那么您最好的替代方案可能是:

  • 阅读了原始版本并预测了新版本,可能是这样的:

build

  • determine = $(shell expr $$(git tag -l --sort -version:refname | head -n 1) +1)

  • 添加一个新目标以包含计算出的版本,并添加构建它的规则,并在每次需要时将其集成到您的shell中
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56246480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档