Makefile缓存问题

Makefile缓存问题

我不确定这个问题,所以如果标题不合适,我深表歉意。

我实现了以下 Makefile 规则:

check-vendor:
    @$(eval HASH1 = $(shell find vendor -type f -print0 | sort -z | xargs -0 shasum | md5 #hash1))
    go mod vendor
    @$(eval HASH2 = $(shell find vendor -type f -print0 | sort -z | xargs -0 shasum | md5))

基本上,我md5在一个文件夹上运行命令vendor两次。在两者之间,go mod vendor是一个可以更新vendor文件夹的命令。

然而,这条规则不起作用。每次(无论是否go mod vendor更新文件夹)HASH1始终等于HASH2.

如果我将它移植到 bash 脚本中,它确实可以工作:

#!/bin/bash
HASH1="$(find vendor -type f -print0 | sort -z | xargs -0 shasum | md5)"
go mod vendor
HASH2="$(find vendor -type f -print0 | sort -z | xargs -0 shasum | md5)"
if [ "$HASH1" = "$HASH2" ]; then
    exit 0
else
    echo "vendor folder is out of sync"
    exit 1
fi

那么,Makefile 规则是怎么回事呢?看来是缓存或者刷新有问题。我不确定...有什么想法吗?

干杯

答案1

Make 变量在运行 shell 命令时不会被求值,它们会在运行之前被求值,因此两个哈希值都是在go mod vendor运行之前计算的。

您应该将哈希计算写入配方中的命令行,而不是创建变量:

check-vendor:
        HASH1="$$(find vendor -type f -print0 | sort -z | xargs -0 shasum | md5)" && \
        go mod vendor && \
        HASH2="$$(find vendor -type f -print0 | sort -z | xargs -0 shasum | md5)" && \
        [ "$$HASH1" = "$$HASH2" ]

或者,检查vendor/modules.txt可能就足够了;在我从事的 Go 项目中,我使用这个(它只检查go mod vendor是否需要的,而不是是否进行任何更改):

vendor/modules.txt: go.mod
        go mod vendor

散列vendor/modules.txt对于您来说就足够了check-vendor

相关内容