Makefile语法错误求助:执行make start-test报错及功能实现需求
问题分析与修复
你的Makefile存在几个关键语法错误,导致执行报错:
$(wildcard $(.env))写法错误:.env不是变量,无需用$()包裹,正确写法是$(wildcard .env);且wildcard函数返回的是匹配到的文件名(存在时返回.env,不存在时返回空),不是yes,判断逻辑完全错误。- 条件语句
ifeq/else/endif需要顶格书写,不能缩进,否则Make会把它当成shell命令执行,引发语法错误。 - 不能在
start-test目标内部嵌套定义all目标,Makefile的目标定义是全局的,嵌套写法不符合语法规范。
修复后的Makefile写法
方式1:使用Makefile原生条件判断
start-test: ifneq ($(wildcard .env),) include .env echo ".env file exists" locust -f tests/load/ else echo ".env file does not exist" endif
注意:ifeq/ifneq和endif必须顶格,命令行(echo、locust这些)必须用Tab键缩进。
方式2:使用shell的if语句(更直观)
start-test: @if [ -f .env ]; then \ export $(cat .env | xargs) && \ echo ".env file exists" && \ locust -f tests/load/; \ else \ echo ".env file does not exist"; \ fi
@用来隐藏命令本身的输出,只显示命令执行结果;- 多行shell命令需要用
\换行,保证语法正确; export $(cat .env | xargs)用来加载.env文件中的环境变量,替代Makefile的include .env(适用于标准key=value格式的.env文件)。
两种方式都能实现需求:存在.env文件时加载变量并执行locust命令,不存在时提示信息且不执行locust。
内容的提问来源于stack exchange,提问作者Tanu
相关产品推荐
相关产品推荐

