我不确定这个问题,所以如果标题不合适,我深表歉意。
我实现了以下 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
。