必须升级Go至1.15+,用官方包覆盖安装并校验GOROOT;跨平台编译需禁用CGO;Makefile要动态依赖所有.go文件、声明.PHONY且输出名勿与目标同名;配置由运行时加载,须确保部署包含config目录并动态指定环境。

go version 不匹配 Leanote 要求怎么办
Leanote 明确要求 Go 1.15 或更高版本,低于该版本会触发 go mod 解析失败或 revel 框架兼容性报错。常见现象是执行 go build 时提示 unknown directive: go 或 module declares its path as: ... but was required from...。
- 先运行
go version确认当前版本;若低于1.15,必须升级,不可降级适配 - Linux/macOS 推荐用官方二进制包覆盖安装(避免包管理器残留旧版),Windows 用户注意卸载旧版后再解压新包
- 升级后检查
GOROOT是否指向新路径,尤其当多版本共存时,which go和go env GOROOT必须一致
GOOS/GOARCH 跨平台编译总出错
想用 Linux 编译 Windows 可执行文件却生成了空文件或报 cannot load runtime/cgo,本质是 CGO_ENABLED 默认开启且目标平台缺少交叉编译支持库。
- 关闭 CGO 是最稳妥方式:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o leanote.exe . - 若项目依赖 C 库(如 SQLite),则需提前在目标平台安装对应交叉编译工具链,不推荐新手尝试
-
GOOS值必须小写(linux、windows、darwin),GOARCH区分大小写(amd64正确,AMD64报错)
Makefile 里编译目标总被跳过
执行 make build 却提示 make: 'build' is up to date.,即使改了源码也不重新编译,说明 Makefile 的依赖声明没绑定到实际 Go 文件。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 不要写死
build: main.go—— 这只监控单个文件,应改为build: $(shell find . -name '*.go' -not -path './vendor/*') - 确保
build目标生成的可执行文件名与目标名不同(例如生成leanote而非build),否则 make 认为“目标已存在”而跳过命令 - 加一句
.PHONY: build显式声明伪目标,避免和同名文件冲突
配置文件切换导致编译产物无法识别环境
用 Viper 加载 application.prod.yaml,但打包后的二进制在生产机上仍读取 dev 配置,问题不在编译阶段而在运行时加载逻辑。
立即学习“go语言免费学习笔记(深入)”;
- Go 编译本身不嵌入配置文件,所有配置加载发生在运行时,必须确保部署包中包含
config/目录及对应 YAML 文件 - 不要把配置路径硬编码成
./config/application.yaml,改用os.Getenv("CONFIG_ENV")动态拼接,启动时传参:CONFIG_ENV=prod ./leanote - 若用 Docker,注意
COPY config/ /app/config/是否遗漏,且容器内工作目录是否与代码中viper.AddConfigPath一致

















