ngrok 编译报错,有没有懂go语言的帮看下

[root@iZwz9f559fa6a44djkfo68Z ngrok]# make release-server release-client
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
        -debug=false \
        -o=src/ngrok/client/assets/assets_release.go \
        assets/client/...
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
        -debug=false \
        -o=src/ngrok/server/assets/assets_release.go \
        assets/server/...
go get -tags 'release' -d -v ngrok/...
src/github.com/mattn/go-runewidth/runewidth.go:7:2: found packages uniseg (doc.go) and main (gen_breaktest.go) in /root/ngrok-server/ngrok/src/github.com/rivo/uniseg
make: *** [Makefile:8: deps] Error 1

该回答引用ChatGPT
根据报错信息,可以看出是在编译ngrok时出现了错误。具体来说,是在执行make release-server release-client命令时,出现了错误。
错误信息中提到了go-bindata和go-runewidth两个包,因此可以猜测是这两个包出现了问题。具体来说,是在执行go get -tags 'release' -d -v ngrok/...命令时,出现了问题。
根据错误信息中提到的文件路径,可以找到runewidth.go文件。打开该文件,可以看到第7行出现了问题。具体来说,是在该行代码中引用了rivo/uniseg包中的两个文件:doc.go和gen_breaktest.go。然而,这两个文件属于不同的包,因此会导致编译错误。
解决该问题的方法是,将runewidth.go文件中引用的不同包中的文件分别放到不同的包中。具体来说,可以将doc.go文件放到uniseg包中,将gen_breaktest.go文件放到一个新的包中。然后,在runewidth.go文件中引用这两个包即可。
另外,还需要检查一下go-bindata包是否正确安装。如果该包没有正确安装,也会导致编译错误。可以尝试重新安装该包,然后再次编译ngrok。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据你提供的错误信息,发现是在执行 make release-server release-client 时出现了错误。具体错误是在执行 go get 命令时,报了一个找不到包的错误。

根据错误信息中提示的 /root/ngrok-server/ngrok/src/github.com/rivo/uniseg 可以看出,这是一个第三方包的路径。

有可能是,这个第三方包被错误地拷贝到了你的项目中,并且在执行 go get 命令时发现了这个包。

你可以尝试移除 src/github.com/rivo/uniseg 这个目录并重新执行 make release-server release-client

如果移除之后问题依然存在,可以尝试执行 go get github.com/rivo/uniseg 命令安装这个包,并清除 GOPATH 下的缓存再重新执行 make 命令。
如果我的回答解决了您的问题,请采纳!

该回答引用ChatGPT:

这个错误可能是由于go版本太老所导致的。请确保你的go版本为1.16及以上。 另外,需要检查是否缺少依赖项。您可以通过运行以下命令来检查和安装依赖项:

go mod tidy
go mod download

根据错误信息,这似乎是由于 go runewidth 库和 go uniseg 库之间的命名冲突造成的。您可以尝试在执行编译之前手动处理这个冲突。以下是一些可能有效的方法:

尝试重新安装 go-bindata 库:

go get github.com/jteeuwen/go-bindata/...

然后再执行编译命令看看是否仍然报同样的错误。

尝试升级 go-runewidth 库。您可以使用以下命令来更新该库:


go get github.com/mattn/go-runewidth

然后再执行编译命令看看是否仍然报同样的错误。

手动处理命名冲突。您可以尝试手动重命名 go uniseg 库的某些文件或包,或者尝试使用一个不同的代替库。具体的处理方法需要视具体情

根据提供的信息,似乎是在执行 make release-server release-client 命令时出现了编译错误。错误信息指出在编译 ngrok 时遇到了 src/github.com/mattn/go-runewidth/runewidth.go:7:2 的问题。

然而,错误信息可能并不充分。请确保您已经安装了 go-bindata 和 go,并且将其添加到了系统的 PATH 环境变量中。

引用chatGPT作答,这个编译错误是因为 ngrok 依赖的一个库 rivo/uniseg 在生成文档时与 main 包发生了冲突,导致编译失败。

解决这个问题的方法是手动删除生成的文档(doc.go)并再次编译,可以按照以下步骤进行:

1.进入 rivo/uniseg 库的源代码目录:

cd $GOPATH/src/github.com/rivo/uniseg

2.删除生成的文档(doc.go):

rm doc.go

3.回到 ngrok 源代码目录,重新编译:

cd $GOPATH/src/github.com/inconshreveable/ngrok
make release-server release-client

这样应该就能成功编译 ngrok 了。

  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:搭建ngrok服务器
  • 除此之外, 这篇博客: 轻松搭建自己的Ngrok服务器中的 获取Ngrok源码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 使用 Git命令直接拉取
    git clone https://github.com/inconshreveable/ngrok.git
    
    • 如图在这里插入图片描述
    • 进入 ngrok 目录下配置环境
    • 设置自己解析的域名 ngrok.cn2118.cn 你自己的域名
    openssl genrsa -out rootCA.key 2048
    openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.cn2118.cn" -days 5000 -out rootCA.pem
    openssl genrsa -out device.key 2048
    openssl req -new -key device.key -subj "/CN=ngrok.cn2118.cn" -out device.csr
    openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
    
    • 如图在这里插入图片描述

    • 替换我们刚刚生成的证书

    cp rootCA.pem assets/client/tls/ngrokroot.crt
    cp device.crt assets/server/tls/snakeoil.crt
    cp device.key assets/server/tls/snakeoil.key
    
    • 如图【中途提示不要惊慌,输入 y 继续替换即可】在这里插入图片描述
    • 生成服务端【温馨提示:过程比较慢请耐心等待!!!!!!】
    make release-server
    
    • 按理讲,应该就可以编译成功了,但是我发现,编译的时候很多依赖包是需要自动下载的,有一个包
    • log4go 会提示访问不到,修改源码,将该包改为 github 上的地址:
    • 找到 /usr/local/src/ngrok/src/ngrok/log/logger.go ,第5行import中的 log 包,改为:
     log "github.com/keepeye/log4go"
    
    • 编译成功后,应该可以在 /usr/local/src/ngrok/bin 下生成了一个 ngrokd 可执行文件,这就是我们的服务端了,现在启动服务端试试:

    • 然后重新 make release-server在这里插入图片描述

    • 生成客户端

    GOOS=windows GOARCH=amd64 make release-server release-client
    
    • 如图
      在这里插入图片描述
    • 启动服务端【域名和端口可自定义】
     nohup bin/ngrokd -domain="ngrok.cn2118.cn" -httpAddr=":8001" &
    
    • 查看是否启动成功
    lsof -i:8001
    
    • 客户端启动
    • 首先到 Ngrok\windows_amd64 目录下载到Windows客户端上
    • 然后在新建一个配置文件ngrok.cfg
    • 内容
    server_addr: "ngrok.cn2118.cn:4433"
    trust_host_root_certs: false
    
    • 如图
      在这里插入图片描述
    • 启动
    ngrok -config=ngrok.cfg -subdomain www 80