Sublime中“go run $file”只运行单文件,因$file仅代入当前文件路径且go run默认仅编译指定文件;多文件项目须用"cmd": ["go", "run", "."]并设"working_dir": "${project_path:${file_path}}"。

Sublime 本身不运行 Go,它只是调用系统 go 命令;绝大多数“按 Ctrl+B 没反应”或“no Go files in current directory”错误,都源于 go 不可见、working_dir 错位、或项目没 go.mod ——不是插件装得不够多。
Sublime 构建系统里 go run $file 为什么只跑单文件?
因为 $file 只展开成当前文件路径,go run 默认只编译并运行一个 .go 文件(且要求是 main 包)。一旦项目含多个文件(比如 main.go + handler.go),就会报错:package main is not a main package 或直接找不到依赖。
- 真正能跑整个项目的写法是:
"cmd": ["go", "run", "."],但必须配合"working_dir": "${file_path}",且该目录下要有go.mod -
${file_path}是当前文件所在目录,不是项目根目录——如果你在子目录打开main.go,${file_path}就不是go.mod所在位置,go run .会失败 - 安全做法:把构建系统设为
"working_dir": "${project_path:${file_path}}",它会优先取项目根(即 Sublime 左侧边栏打开的文件夹), fallback 到当前文件目录 - macOS/Linux 用户注意:别用
shell: true配go run .,它可能让.解析为 Sublime 自身工作目录而非你预期的路径;显式写working_dir更稳
按 Ctrl+B 报 exec: "go": executable file not found
这不是 Go 没装好,而是 Sublime 启动时根本没拿到你的 PATH。GUI 启动的 Sublime(macOS 点图标、Windows 从开始菜单点)不会读 ~/.zshrc 或系统环境变量,哪怕终端里 go version 正常也没用。
- 验证方法:Sublime 里按
Ctrl+`打开内置终端,输go version—— 如果报错,就确认没通路径 - 最可靠解法:在
Preferences → Settings – User里硬编码PATH:"env": { "PATH": "/usr/local/go/bin:/Users/you/go/bin:${PATH}" }(macOS/Linux)或"env": { "PATH": "C:/Go/bin;C:/Users/you/go/bin;${PATH}" }(Windows) - 改完必须完全退出 Sublime 再重开,仅重启窗口无效
- 别信“改系统 PATH 就行”——Windows 用户若用开始菜单启动,必须加进「系统级」PATH,用户级 PATH 不生效;macOS 用户用
launchctl setenv是黑盒操作,容易漏 reload Dock,不如直接改 Sublime 配置
LSP-Go 跳转定义失效,但 go run . 能跑
能跑 ≠ 能跳转。go run . 只依赖 go 命令和 go.mod,而 gopls(LSP-Go 底层)还额外要求:模块识别成功、索引完成、且当前文件在 module 根下被打开。
立即学习“go语言免费学习笔记(深入)”;
- 检查
go.mod是否真在项目根目录:在终端进到你认为的“项目根”,执行go list -m,输出应为模块名;如果报not in a module,说明go.mod位置不对或没初始化 - 确保 Sublime 是以文件夹形式打开项目(File → Open Folder),而不是只打开单个
.go文件——否则 LSP-Go 无法推导working_dir,gopls启动后会卡在 “starting…” 或加载空包列表 -
gopls.build.experimentalWorkspaceModule必须设为true(Go 1.21+ 强制),否则即使有go.mod,gopls也拒绝加载 workspace - 首次启用 LSP-Go 后,底部状态栏会显示 “Indexing…”,等几秒到十几秒(取决于依赖数量),此时跳转才开始生效;别一看到没反应就以为配错了
最容易被忽略的是:Sublime 的 working_dir 和 gopls 的 module root 必须是同一个目录,且这个目录必须通过 File → Open Folder 显式打开——靠 ${file_path} 推导出来的路径,在复杂项目结构里大概率不准。


















