将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’,所以目前我卡住了,正在寻找相关的博客和可以请教的人,但到目前为止运气不佳。


6 回复

我在 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这样的复杂项目,你需要:

  1. 检查TinyGo支持的包列表(通常不支持runtime/debug
  2. 使用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目录下创建对应的包实现。

回到顶部