Golang Present工具关闭Playground时无法找到第三方包求助
解决Golang Present工具本地运行时第三方依赖找不到的问题
问题场景
我使用Golang Present工具制作幻灯片,嵌入了如下代码引用:
.play simple/main.go /START OMIT/,/END OMIT/
其中main.go是导入了非标准库模块的程序:
package main import ( "fmt" "golang.org/x/sync/errgroup" ) func main() { // START OMIT g := new(errgroup.Group) fmt.Println(g) // END OMIT }
执行present -use_playground=true时一切正常,但执行present -use_playground=false时出现错误:
prog.go:7:2: cannot find package "golang.org/x/sync/errgroup" in any of: /usr/local/go/src/golang.org/x/sync/errgroup (from $GOROOT) /Users/xxx/go/src/golang.org/x/sync/errgroup (from $GOPATH) Program exited: exit status 1
问题原因
- 当
-use_playground=true时,代码会提交到Go官方Playground运行,该环境预装了常见第三方库,因此能正常编译。 - 当
-use_playground=false时,Present工具会在本地Go环境编译代码,但你的本地环境未安装golang.org/x/sync/errgroup这个第三方依赖,导致包找不到。
解决方案
方法1:本地安装缺失的依赖
根据你的Go环境模式选择对应命令:
Go Modules模式(Go 1.11+,项目含go.mod):
在幻灯片项目根目录执行:go get golang.org/x/sync/errgroup该命令会将依赖下载到本地模块缓存,并更新
go.mod文件。GOPATH模式(旧版Go):
直接执行:go get golang.org/x/sync/errgroup依赖会被下载到
$GOPATH/src下的对应路径。
方法2:添加条件编译的模拟实现(临时方案)
如果不想安装依赖,可通过条件编译在本地运行时使用模拟结构:
package main import ( "fmt" ) // 本地运行时的模拟errgroup.Group //go:build !playground type Group struct{} func newGroup() *Group { return &Group{} } // Playground环境使用真实的errgroup //go:build playground import "golang.org/x/sync/errgroup" func newGroup() *errgroup.Group { return new(errgroup.Group) } func main() { // START OMIT g := newGroup() fmt.Println(g) // END OMIT }
运行时通过标签控制:
- 使用Playground:
present -use_playground=true -tags=playground - 本地运行:
present -use_playground=false
内容的提问来源于stack exchange,提问作者idefixcert
相关产品推荐
相关产品推荐

