이 질문에 대해 잘 알지 못해서 제목이 적절하지 않다면 사과드립니다.
다음 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 변수는 쉘 명령을 실행할 때 평가되지 않고 실행 전에 평가되므로 두 해시 모두 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
.