You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile已存在文件仍报不存在,环境变量加载异常

问题分析与解决方案

核心问题根源

  1. 错误的include用法:你在test目标的命令序列中写了@-include .env,但include是Make的顶层解析指令,并非shell命令。当Make执行这一行时,会将其传递给shell执行,而macOS默认的shell(zsh/bash)并不存在include命令,因此抛出No such file or directory错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:37:53