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
相关产品推荐
相关产品推荐

