Makefile已存在文件仍报不存在,环境变量加载异常
问题分析与解决方案
核心问题根源
- 错误的
include用法:你在test目标的命令序列中写了@-include .env,但include是Make的顶层解析指令,并非shell命令。当Make执行这一行时,会将其传递给shell执行,而macOS默认的shell(zsh/bash)并不存在include命令,因此抛出No such file or directory错误。 DB变量为空的原因:每个Make命令行都在独立的子shell中执行。你顶层的include $(wildcard .env)已经将.env的内容加载为Make变量,但错误的include命令执行后,后续命令的变量展开逻辑可能受到干扰;另外如果go test依赖的是shell环境变量而非Make变量,也会出现变量为空的情况。
修复步骤
方案1:移除冗余的错误命令
既然顶层已经通过include $(wildcard .env)加载了.env的变量,目标内的@-include .env完全冗余,直接删除即可:
include $(wildcard .env) DB_URL=postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable&pool_max_conns=10 test: @echo $(DB_URL) @cat .env @echo "Running tests" @DB=$(DB_URL) go test ./... -v -coverprofile=coverage.out
方案2:若需传递shell环境变量
如果go test需要读取.env中的其他环境变量(而非仅Make变量DB_URL),应使用shell的source命令加载.env,并将相关命令放在同一个子shell中执行:
include $(wildcard .env) DB_URL=postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable&pool_max_conns=10 test: @echo $(DB_URL) @cat .env @echo "Running tests" @source .env && DB=$(DB_URL) go test ./... -v -coverprofile=coverage.out
关于“之前正常”的推测
大概率是你之前的shell环境中,将include设置为了source的别名(比如在.zshrc/.bashrc中添加了alias include='source'),后续别名被移除或shell配置重置,导致原本隐藏的错误显现。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

