Makefile 缓存创建误报结果

Makefile cache creating false positive outcome

我有一个 make 目标,我通常需要 运行 两次才能获得准确的结果。即第一个运行 if accurate then on the 2nd 运行,如果变量改变了,它仍然显示以前的输出,这是错误的,有没有办法摆脱缓存或清除它之间。

.PHONY:check-tf-lint
check-tf-lint: configure ## TF Linting
    $(eval list_of_dir := $(shell cd ${deployment} && ls -ld */ |  awk '{print $$NF}'|  grep -v 'test_cases'| sed 's|/||g'))
    $(shell touch ${quality-metrics}/formatting.txt)
    @for i in aws_bot; do \
        make set-tf-version -e infra_module_path=$$i; \
        terraform fmt -check -list=false ${deployment}/$$i ; \
        if [ "$$?" != "0" ]; then \
            echo "Need Formatting in $$i" >> ${quality-metrics}/formatting.txt; \
            terraform fmt -check ${deployment}/$$i >> ${quality-metrics}/formatting.txt; \
            echo "" >> ${quality-metrics}/formatting.txt; \
        fi \
    done
    $(eval TMP := $(shell (cat ${quality-metrics}/formatting.txt | wc -l)))
    echo "${TMP}"
    @if [ "$(TMP)" = "0" ]; then \
        echo "All Good! No Formatting Needed."; \
    else \
        echo "Kindly Format Below Mentioned code and check in Again"; \
        cat ${quality-metrics}/formatting.txt; \
    fi
    $(shell rm -rf ${quality-metrics}/formatting.txt)
    @if [ "$(TMP)" != "0" ]; then \
        exit 1; \
    fi

经验法则:永远不要在 make 配方中使用 evalshell 函数。如果你这样做了,那就是一个非常明确的信号,表明某处出了问题。

在您的情况下,您看到此行为的原因是 make 将扩展 ALL 变量 和函数 之前配方中的所有行配方中的第一行被调用。所以就 make 而言,你的食谱是这样处理的:

.PHONY:check-tf-lint
check-tf-lint: configure ## TF Linting
        $(eval list_of_dir := $(shell cd ${deployment} && ls -ld */ |  awk '{print $$NF}'|  grep -v 'test_cases'| sed 's|/||g'))
        $(shell touch ${quality-metrics}/formatting.txt)
        $(eval TMP := $(shell (cat ${quality-metrics}/formatting.txt | wc -l)))
        $(shell rm -rf ${quality-metrics}/formatting.txt)
        @for i in aws_bot; do \
            make set-tf-version -e infra_module_path=$$i; \
            terraform fmt -check -list=false ${deployment}/$$i ; \
            if [ "$$?" != "0" ]; then \
                echo "Need Formatting in $$i" >> ${quality-metrics}/formatting.txt; \
                terraform fmt -check ${deployment}/$$i >> ${quality-metrics}/formatting.txt; \
                echo "" >> ${quality-metrics}/formatting.txt; \
            fi \
        done
        echo "${TMP}"
        @if [ "$(TMP)" = "0" ]; then \
            echo "All Good! No Formatting Needed."; \
        else \
            echo "Kindly Format Below Mentioned code and check in Again"; \
            cat ${quality-metrics}/formatting.txt; \
        fi
        @if [ "$(TMP)" != "0" ]; then \
            exit 1; \
        fi

您应该始终使用 shell 工具而不是 make 工具编写您的食谱。设置shell变量,不要用eval设置make变量,直接运行shell命令(你在毕竟是食谱!)而不是使用 make 的 shell 函数。

您可能需要将所有行放在一个脚本中(使用分号/反斜杠)才能使其正常工作。或者考虑 .ONESHELL 但这是一组更大的更改。

这对我有用!

.PHONY:check-tf-lint
check-tf-lint: ## TF Linting
    $(eval list_of_dir := $(shell cd ${deployment} && ls -ld */ |  awk '{print $$NF}'|  grep -v 'test_cases'| sed 's|/||g'))
    @for i in $(list_of_dir); do \
        make set-tf-version -e infra_module_path=$$i; \
        terraform fmt -check -list=false ${deployment}/$$i ; \
        if [ "$$?" != "0" ]; then \
            echo "Need Formatting in $$i" >> ${quality-metrics}/formatting.txt; \
            terraform fmt -check ${deployment}/$$i >> ${quality-metrics}/formatting.txt; \
            echo "" >> ${quality-metrics}/formatting.txt; \
        fi \
    done
    @if [ -e "${quality-metrics}/formatting.txt" ]; then \
        export MNC=`cat ${quality-metrics}/formatting.txt | wc -l`; \
        if [ "$${MNC}" = "0" ]; then \
            echo "All Good! No Formatting Needed."; \
        else \
            echo ""; \
            echo "Kindly Format Below Mentioned code and check in Again"; \
            cat ${quality-metrics}/formatting.txt; \
        fi; \
        rm -rf ${quality-metrics}/formatting.txt; \
        if [ "$${MNC}" != "0" ]; then \
            exit 1; \
        fi \
    fi