凌云的博客

行胜于言

go build 报错小记

分类:go| 发布时间:2024-10-16 09:58:00

问题

项目中有一个 go 写的工具代码如下:

//go:build ignore
// +build ignore

package main

func main() {
    println("hello demo")
}

一直使用如下命令编译:

go build main.go

后面随着这个工具扩展,将 main.go 扩展成模块了,例如:

main.go

//go:build ignore
// +build ignore

package main

func main() {
    DoPreTask()
    println("hello demo")
}

pretask.go

package main

func DoPreTask() {
        println("do pretask")
}

go.mod

module example.com/ignoredemo

go 1.20

编译报错:

$ go build
# example.com/ignoredemo
runtime.main_main·f: function main is undeclared in the main package

明明模块中有 main 函数为什么还是报 main 函数未定义呢?

问题排查

将 pretask.go 的代码放回 main.go 中,代码变为

//go:build ignore
// +build ignore

package main

func main() {
    DoPreTask()
    println("hello demo")
}

func DoPreTask() {
        println("do pretask")
}

go.mod

module example.com/ignoredemo

go 1.20
$ go build
package example.com/ignoredemo: build constraints exclude all Go files in xxx

报错所有 go 文件都被排除了,查看 main.go 发现有如下代码:

//go:build ignore
// +build ignore

去掉这两行后,再次编译,一切正常,问题解决,最终代码为:

main.go

package main

func main() {
    DoPreTask()
    println("hello demo")
}

pretask.go

package main

func DoPreTask() {
        println("do pretask")
}

go.mod

module example.com/ignoredemo

go 1.20

参考

Build_constraints