将Go移植到TinyGo遇到困难,求帮助!
将Go移植到TinyGo遇到困难,求帮助! 你好,我不太确定这里是否有许多关于TinyGo的讨论,但我正在努力寻求帮助,而gophers slack上的TinyGo频道相当安静。
我正在寻求关于尝试将一个Go项目(git-bug,它有很多依赖)移植到TinyGo的建议、意见、警告等。这是个坏主意吗?除了gophers slack、这里和tinygo.org之外,还有其他地方可以寻求帮助吗?
我首先想到的是尝试构建,看看进展如何并检查缺失的依赖项,但在新克隆的git-bug仓库中运行命令tinygo build -o git-bug后,它下载了依赖项,然后立即失败并显示:
build github.com/MichaelMure/git-bug: cannot load runtime/debug: malformed module path "runtime/debug": missing dot in first path element
我在仓库中任何地方都找不到‘runtime/debug’,所以目前我卡住了,正在寻找相关的博客和可以请教的人,但到目前为止运气不佳。
我在 TinyGo 的 GitHub 页面上稍微搜索了一下,找到了这个,所以看起来这可能是 TinyGo 运行时实现当前已知的限制之一。
有人建议我使用 TinyGo 来减小 WASM 构建的包大小。目前我还不知道具体能减少多少,但认为首先研究一下 TinyGo 可能是值得的。
显然,Go 的 WASM 输出文件很大,这是因为缺乏对垃圾回收的支持,需要包含整个运行时。
// 代码示例(如有)
感谢 @skillian,这对我帮助很大,并且展示了如何追踪类似的错误。
顺便说一下,我提交了一个问题以澄清情况:
来源: github.com/tinygo-org/tinygo 标题: cannot load runtime/debug: malformed module path “runtime/debug”: missing dot in first path element 内容: 我正在尝试编译现有的 Go 代码(git-bug 及其依赖项),作为在项目中运行它们的一部分…
有人建议我使用 TinyGo 来减小 WASM 构建的包大小。目前我还不知道具体能减少多少,但认为首先研究一下 TinyGo 可能是值得的。
明白了。在你采纳我的建议之前,为了交叉验证一下,你是否尝试过他们的官方指南?Getting Started | TinyGo
根据我的理解,tiny-go 就像一个 Go 编译器(参见:https://tinygo.org/usage/basic/)。显然,你不需要从头开始编译。
编辑:我忘了告诉你,使用前记得阅读这个:Go language features | TinyGo。目前并非所有功能都受支持(他们正在努力完善)。
happybeing:
这里是TinyGo相关的问题,但我很难找到帮助,而且gophers slack上的TinyGo频道相当冷清。
只是好奇,有什么理由在部署时使用TinyGo吗?据我所知,他们目前是一个研究团队,正在探索Go在嵌入式领域的可能性。
WASM在标准Go编译器中早已可用。
happybeing:
我正在寻求关于尝试将一个Golang项目(git-bug,它有很多依赖)移植到TinyGo的建议、意见、警告等。这是个坏主意吗?除了gophers slack、这里和tinygo.org,还有其他地方可以寻求帮助吗?
建议在Github上提一个以“Question: how to …?”为前缀的issue。这样会快得多,也不会吓到维护者。
这是一个典型的TinyGo兼容性问题。runtime/debug 是Go标准库的一部分,但TinyGo并不完全支持所有标准库包。你需要检查TinyGo的兼容性并调整构建方式。
首先,确认你的TinyGo版本和构建目标:
tinygo version
对于git-bug这样的复杂项目,你需要:
- 检查TinyGo支持的包列表(通常不支持
runtime/debug) - 使用TinyGo支持的构建标签或条件编译
尝试使用-target参数指定一个TinyGo完全支持的目标,比如wasm:
tinygo build -target=wasi -o git-bug.wasm
如果项目必须使用runtime/debug,你可能需要修改代码。创建一个替换文件debug_stub.go:
// +build tinygo
package debug
func ReadBuildInfo() *BuildInfo {
return nil
}
type BuildInfo struct {
Path string
Main Module
Deps []*Module
Settings []BuildSetting
}
type Module struct {
Path string
Version string
Sum string
Replace *Module
}
type BuildSetting struct {
Key string
Value string
}
然后在需要的地方使用构建标签:
// +build !tinygo
import "runtime/debug"
// +build tinygo
import "yourproject/debug_stub"
对于依赖问题,使用TinyGo的-print-imports查看实际依赖:
tinygo build -target=wasi -print-imports 2>&1 | grep -v "^#"
如果遇到更多标准库不兼容问题,考虑使用TinyGo的替换机制,在tinygo目录下创建对应的包实现。

