【问题标题】:Makefile include .env conflicts with MAKEFILE_LISTMakefile 包含 .env 与 MAKEFILE_LIST 冲突
【发布时间】:2020-10-08 17:36:17
【问题描述】:

我有一个 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 的了解不够,无法理解问题所在。

有什么想法吗?

谢谢。

【问题讨论】:

标签: makefile


【解决方案1】:

解决方案

更新您的help 目标以利用$(firstword $(MAKEFILE_LIST)) 而不仅仅是$(MAKEFILE_LIST),以便grep 在使用## cmets 管道目标之前定位正确的文件。

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 以及Makefile。由于评论/帮助消息的模式与.env 中的任何内容都不匹配,因此没有任何输出,但Makefile 确实包含匹配项。这会导致grep 在它发现东西的FILENAME 前面添加。在这种情况下,Makefile。然后awk 命令撕掉## 之前的所有内容并将它们剥离到: 冒号,grep 将其读取为目标,而不是Makefile 中的目标。因此,您所有的帮助输出都有正确的注释,但目标错误。您可以通过在这两个文件所在的目录中运行以下 grep 命令来验证行为:

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

【讨论】:

  • 对我来说就像一个魅力。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多