Golang中go:generate无法正常工作的问题排查

Golang中go:generate无法正常工作的问题排查 我正在开始学习Golang。我使用QuickTemplate来生成HTML页面。QuickTemplate利用//go:generate指令来生成随后被编译的Go源代码。

据我理解,go generate会在真正的go build任务完成之前启动命令。

我的主Go文件有一个//go:generate指令来启动qtc(快速模板编译器)。遗憾的是它没有启动qtc命令,导致出现"no go files"错误。

Go版本是Win10 go version go1.12.3 windows/amd64。

当我手动启动qtc然后执行go build时,一切正常。

我是否遗漏了什么?

感谢您的帮助。


更多关于Golang中go:generate无法正常工作的问题排查的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

不。看起来自从1.4版本引入以来就一直是这样工作的。但我不完全确定。

更多关于Golang中go:generate无法正常工作的问题排查的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好。你需要运行

go generate main.go

例如。无论是在运行还是构建时都不会发生任何事情

在基础服务器示例中,他们使用了如下指令

//go:generate qtc templates

其中templates是模板的路径

你说得对。我误读了文档中的明确说明:

Go generate 永远不会 被 go build、go get、go test 等命令自动运行,必须显式执行。

不过,考虑到许多项目都在使用代码生成(模板、ORM 等应用场景),这或许可以作为一个新功能特性。

使用 //go:generate qtc templates 并没有更好用, 实际上甚至使用 //go:generate echo helloworld//go:generate touch helloworld 也无法正常工作。

我遗漏了某些东西,导致无法让 go build 启动 go generate 任务。

在Golang中,//go:generate指令需要显式调用go generate命令才会执行,它不会在go build过程中自动运行。这是您遇到问题的根本原因。

//go:generate是一个代码生成指令,它告诉Go工具链在需要时如何生成代码,但实际执行需要您手动运行go generate命令。

以下是解决方案:

  1. 显式运行go generate: 在构建项目之前,先执行:
go generate

然后再运行:

go build
  1. 在Makefile中自动化(推荐): 创建一个Makefile来简化流程:
generate:
    go generate ./...

build: generate
    go build -o myapp .

all: build

.PHONY: generate build all
  1. 检查您的go:generate指令: 确保指令格式正确。示例:
//go:generate qtc -dir=templates
package main
  1. 验证qtc工具安装: 确保qtc命令在PATH中可用:
go install github.com/valyala/quicktemplate/qtc@latest
  1. Windows环境下的完整示例
# 1. 安装qtc
go install github.com/valyala/quicktemplate/qtc@latest

# 2. 设置PATH(如果qtc不在PATH中)
set PATH=%PATH%;%GOPATH%\bin

# 3. 生成代码
go generate

# 4. 构建项目
go build

您看到的"no go files"错误是因为在运行go build时,所需的模板生成的Go文件还不存在,因为go generate没有被执行。

正确的开发流程应该是:

go generate  # 生成模板代码
go build     # 编译项目
go run main.go  # 运行程序

或者将go generate集成到您的构建脚本或CI/CD流程中。

回到顶部