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 변수는 쉘 명령을 실행할 때 평가되지 않고 실행 전에 평가되므로 두 해시 모두 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.

관련 정보