gpt4 book ai didi

Makefile 包含 .env 与 MAKEFILE_LIST 冲突

转载 作者:行者123 更新时间:2023-12-05 01:33:51 26 4
gpt4 key购买 nike

我有一个 Makefile,我想在其中加载放置在 .env 文件中的环境变量。

我正在使用 include 指令来实现这一点。

-include .env

我还有一个 help 目标来显示可用任务:

help: ## Displays help menu
grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

问题是当与 include 指令一起使用时,它不能正常工作。帮助任务仅将“Makefile”显示为所有目标的名称。

$(MAKEFILE_LIST) 返回“Makefile, .env”而不是目标名称,所以我猜它以某种方式与 .env 混淆了。

我对 Makefile 了解不够,无法理解哪里出了问题。

有什么想法吗?

谢谢。

最佳答案

解决方案

更新您的 help 目标以利用 $(firstword $(MAKEFILE_LIST)) 而不仅仅是 $(MAKEFILE_LIST) 以便 grep 在使用 ## 注释对目标进行管道传输之前以正确的文件为目标。

help: ## Displays help menu
grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(firstword $(MAKEFILE_LIST)) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

解释

$MAKEFILE_LIST 变量的原始行为是输出 Makefile 而不是包含的 Makefile 的列表。因此,在您包含之后,它会将名称附加到列表中。所以你看到了你提到的 Makefile, .env。您为 help 目标发布的 grep 命令采用 $MAKEFILE_LIST 和 grepping .env 以及 生成文件。由于注释/帮助消息的模式与 .env 中的任何内容都不匹配,因此没有任何输出,但 Makefile 确实包含匹配项。这导致 grep 将它在其中找到内容的 FILENAME 放在前面。在本例中,Makefileawk 命令然后撕掉 ## 之前的所有内容,并将它们剥离为 : 冒号,这是 grep 添加的,并将其读取为目标而不是Makefile 中的目标是什么。所以你所有的帮助输出都有正确的评论但是错误的目标。您可以通过在这两个文件都存在的目录中运行以下 grep 命令来验证行为:

grep -E '^[a-zA-Z_-]+:.*?## .*$$' Makefile .env

关于Makefile 包含 .env 与 MAKEFILE_LIST 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64267861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com