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

Makefile切换目录后执行go run main.go失败,求助排查原因

Makefile切换目录执行命令失败的解决方法

问题根源

Makefile里每一行缩进的命令,都是在独立的Shell进程里运行的。你写的cd $(PWD)/cmd/myapp只是在一个临时Shell里切换了目录,这个Shell执行完就退出了,后面的go run main.go还是在原来的工作目录执行,自然找不到main.go文件。

三种修复方案

方案1:把命令合并到同一行

让cd和go run在同一个Shell进程里执行,用&&连接(确保cd成功才执行后续命令,更安全):

stand-app:
    $(info Booting up the app for local testing)
    cd $(PWD)/cmd/myapp && go run main.go

如果不管cd是否成功都要执行,也可以用分号分隔,但不推荐这种方式:

stand-app:
    $(info Booting up the app for local testing)
    cd $(PWD)/cmd/myapp; go run main.go

方案2:直接指定文件路径或用Make的-C参数

最简单的方式可以直接在go run里指定文件路径,省去cd步骤:

stand-app:
    $(info Booting up the app for local testing)
    go run ./cmd/myapp/main.go

如果项目结构复杂,也可以用Make自带的-C参数切换到目标目录执行命令:
主Makefile:

stand-app:
    $(info Booting up the app for local testing)
    $(MAKE) -C $(PWD)/cmd/myapp run

然后在cmd/myapp目录下创建一个小Makefile:

run:
    go run main.go

方案3:启用.ONESHELL伪目标(GNU Make 3.82+可用)

如果使用的是GNU Make,可以让整个target的所有命令在同一个Shell里执行,这样cd的效果会持续到后续命令:

stand-app: .ONESHELL
    $(info Booting up the app for local testing)
    cd $(PWD)/cmd/myapp
    go run main.go

也可以全局启用该特性(会影响所有后续target):

.ONESHELL:
stand-app:
    $(info Booting up the app for local testing)
    cd $(PWD)/cmd/myapp
    go run main.go

内容的提问来源于stack exchange,提问作者panza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:40:43