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フォルダからコマンドを2回実行しています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

関連情報