构建Golang包时未使用最新源代码的问题如何解决

构建Golang包时未使用最新源代码的问题如何解决 我正在尝试使用命令“go build”来构建一个包。它能够构建出可执行文件,但我发现源代码中的更改没有被考虑进去。即使我加入了一些错误的语法,它仍然会继续构建可执行文件。

我尝试过清理缓存,但这没有帮助。

5 回复

根据我的理解,这个问题已经解决了,干得漂亮。

更多关于构建Golang包时未使用最新源代码的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你是否在编辑器和命令行中构建得到了相同的结果?一个常见的问题可能是编辑器没有保存你的源代码。尝试使用不同的编辑器来验证更改是否被保存,这或许是值得的。

Ram_Reddy:

我尝试清理了缓存,但没有效果。

有时我发现 Go 文件看起来没问题,但实际上并未保存(在我这里是由 Sublime 导致的)。我经常遇到这种情况,go build 获取的是已保存的内容,而不是我正在查看的内容。

感谢大家的快速回复。

我使用的语法是正确的,只是代码被折叠了。但令人惊讶的是,即使添加了许多更改,可执行文件的大小也没有增加。不过,我看到这些更改确实被编译并执行了。

这种情况通常是由于Go的构建缓存机制导致的。即使清理了缓存,也可能存在其他因素影响构建过程。以下是一些解决方案:

1. 强制重新构建

# 强制重新构建所有依赖
go build -a

# 或者使用clean和rebuild组合
go clean -cache
go build

2. 禁用缓存构建

# 临时禁用缓存
GOCACHE=off go build

# 或者设置到临时目录
GOCACHE=/tmp/gocache go build

3. 检查构建标签和条件编译

确保没有构建标签阻止你的代码被编译:

// 检查文件顶部是否有这样的标签
// +build ignore

// 或者检查是否有条件编译阻止代码执行
//go:build !linux

4. 验证文件是否在正确位置

# 检查文件是否真的在构建上下文中
go list -f '{{.GoFiles}}' ./...

# 查看构建包含的文件
go list -json ./... | jq '.GoFiles'

5. 使用-race标志强制重新编译

# race检测会强制重新编译
go build -race

6. 检查vendor目录

如果有vendor目录,可能会使用旧的依赖:

# 移除vendor目录
rm -rf vendor

# 或者使用-mod=readonly
go build -mod=readonly

7. 完整清理方案

# 完整清理缓存和临时文件
go clean -cache -testcache -modcache
rm -rf ~/.cache/go-build
go build

8. 验证构建输出

# 查看构建的详细信息
go build -x -v

# 检查实际编译的文件
go build -work 2>&1 | grep WORK

9. 检查文件系统时间戳

确保文件修改时间正确:

# 更新文件时间戳
touch main.go

# 或者更新所有go文件
find . -name "*.go" -exec touch {} \;

10. 使用go run直接测试

# 直接运行看是否包含最新代码
go run main.go

如果以上方法都不起作用,检查是否有符号链接、文件权限问题,或者考虑在Docker容器中构建以排除环境干扰。

回到顶部