この質問についてよく知らず、タイトルが適切でない場合はお詫び申し上げます。
次の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
。