我有一个 Makefile,我想在其中加载放置在.env文件中的环境变量 。
我正在使用该include指令来实现这一点。
-include .env
Run Code Online (Sandbox Code Playgroud)
我还有一个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}'
Run Code Online (Sandbox Code Playgroud)
问题是当与 include 指令一起使用时,它不能正常工作。帮助任务只显示“Makefile”作为所有目标的名称。
该$(MAKEFILE_LIST)回报“的Makefile,.ENV”,而不是目标的名字,所以我想它成为搞砸与.ENV莫名其妙。
我对 Makefile 的了解不够,无法理解出了什么问题。
有任何想法吗?
谢谢。
小智 5
更新你的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}'
Run Code Online (Sandbox Code Playgroud)
$MAKEFILE_LIST变量的原始行为是输出Makefile而不是包含的 Makefile 列表。因此,在您包含之后,它会将名称附加到列表中。所以你看到你提到的Makefile, .env。在grep您发布该命令help的目标正在$MAKEFILE_LIST和grepping.env沿Makefile。由于注释/帮助消息的模式与任何内容都不匹配,.env因此没有任何输出,但Makefile确实包含匹配项。这导致grep前面加上FILENAME它发现的东西。在这种情况下,Makefile。该awk命令然后撕掉之前的所有内容## 并将它们剥离到:冒号,它是 grep 添加的,它将它读作目标而不是目标在你的Makefile. 所以你所有的帮助输出都有正确的注释,但目标错误。您可以通过在这两个文件所在的目录中运行以下 grep 命令来验证行为:
grep -E '^[a-zA-Z_-]+:.*?## .*$$' Makefile .env
Run Code Online (Sandbox Code Playgroud)