农村大阿嫂 發表於 2021-12-16 22:31:00

Go 疑难杂症汇总

<hr>
<h2 id="1-revision-v000-unknown-revision-v000">1. <code>revision v0.0.0: unknown revision v0.0.0</code></h2>
<p><code>go get -u github.com/uudashr/gopkgs/cmd/gopkgs</code> 报错:</p>
<pre><code>$ go get -u github.com/uudashr/gopkgs/cmd/gopkgs
go: downloading github.com/uudashr/gopkgs v1.3.2
go: downloading github.com/uudashr/gopkgs/cmd/gopkgs v0.0.0-20191024034442-58e9141cd7d6
go: downloading github.com/uudashr/gopkgs v2.0.1+incompatible
go: github.com/uudashr/gopkgs/cmd/gopkgs upgrade =&gt; v0.0.0-20191024034442-58e9141cd7d6
go get: github.com/uudashr/gopkgs/cmd/gopkgs@v0.0.0-20191024034442-58e9141cd7d6 requires
      github.com/uudashr/gopkgs/v2@v2.1.0 requires
      github.com/uudashr/gopkgs@v0.0.0: reading github.com/uudashr/gopkgs/go.mod at revision v0.0.0: unknown revision v0.0.0
</code></pre>
<p>根据 Cannot install gopkgs tool,换个 gopkgs 安装:</p>
<pre><code>$ go get github.com/uudashr/gopkgs/v2/cmd/gopkgs
go: downloading github.com/uudashr/gopkgs/v2 v2.1.2
go: found github.com/uudashr/gopkgs/v2/cmd/gopkgs in github.com/uudashr/gopkgs/v2 v2.1.2
go: downloading github.com/karrick/godirwalk v1.12.0
go: downloading github.com/pkg/errors v0.8.1
</code></pre>
<h2 id="2-invalid-version-unknown-revision">2. <code>invalid version: unknown revision</code></h2>
<h3 id="21-现象及解决方法">2.1 现象及解决方法</h3>
<p>go run cmd/main.go 时报错:</p>
<pre><code># go run svc/lubanseven/cmd/lubanseven/main.go
vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/metrics.go:21:2: cannot find package "." in:
      /home/lubanseven/go/src/AANM/go/vendor/io/fs
</code></pre>
<p>查看项目 go.mod 文件发现文件定义版本(1.16) 和当前 go version 版本(1.15.15) 不一致。于是删掉 go.mod 文件,重新 go mod init &lt;project_name&gt;,执行 go mod tidy 报错:</p>
<pre><code>go: github.com/hashicorp/vault@v1.9.1 requires
      github.com/hashicorp/vault/api/auth/approle@v0.0.0-00010101000000-000000000000: invalid version: unknown revision 000000000000
</code></pre>
<p>查阅文档发现 go mod tidy 调用的是 go get,接着调用的是 git 下载 github 的包。于是使用 go get 命令手动下载 vault:</p>
<pre><code>go get -u github.com/hashicorp/vault
</code></pre>
<p>报错:</p>
<pre><code>ssh:connect to host github.com port 22: Connection timed out.
</code></pre>
<p>ssh 连接的报错,有可能 port 端口不是 22,也有可能是别的原因,这里并未深究,将下载方式从 ssh 切换到 https:</p>
<pre><code>git config --global url.git@github.com:.insteadOf https://github.com/
</code></pre>
<p>接着执行 go get 手动下载 go: github.com/hashicorp/vault 继续报错:</p>
<pre><code>Permission denied (publickey).
fatal: Could not read from remote repository.
</code></pre>
<p>提示 Permission denied,将 public key 添加到 github 上,继续执行 go get -u,继续报错:</p>
<pre><code>go: github.com/hashicorp/vault@v1.9.1 requires
      github.com/hashicorp/vault/api/auth/approle@v0.0.0-00010101000000-000000000000: invalid version: unknown revision 000000000000
</code></pre>
<p>看来路走错了,接着搜文档,发现和之前把 go.mod 删掉有关系。之前的 go.mod 中有 replace 字段定义包版本的行为,现在新建的包并没有 replace,也没有 require。</p>
<p>将之前包版本的 require 复制到当前 go.mod(只复制了 require 并未复制 replace),接着执行 go mod tidy,下载完成。</p>
<h2 id="3-cannot-find-package--in">3. <code>cannot find package "." in:*******</code></h2>
<p>执行 go run cmd/main.go 报错:</p>
<pre><code># go run svc/lubanseven/cmd/lubanseven/main.go
vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/metrics.go:21:2: cannot find package "." in:
      /home/lubanseven/go/src/AANM/go/vendor/io/fs
</code></pre>
<p>还是原来那个错...</p>
<p>查阅文档发现 GOPATH 包路径不对,当前执行路径是:</p>
<pre><code># pwd
/home/lubanseven/vsWorkspace/dev/go

// GOPATH 路径
# go env | grep -i path
GOPATH="/root/go"
</code></pre>
<p>于是按照文档要求将代码复制到 GOPATH 路径下,挫是挫了点,但是此刻能运行已经什么都不在乎了。接着执行,还是报一样的错...</p>
<p>冷静思考一番,还是从开始的 go.mod 入手,开始的 go.mod 定义了 go 版本是 1.16 这里我们换了版本出现了这一系列问题,会不会是 go 版本的问题呢?于是,将 go 版本从 1.15 换到 1.16,接着执行 <code>go run cmd/main.go</code> 执行成功...</p>
<h2 id="4-fatal-unable-to-find-remote-helper-for-https">4. <code>fatal: unable to find remote helper for 'https'</code></h2>
<p><code>go mod tidy</code> 报错:</p>
<pre><code>$ go mod tidy
Gin imports
      github.com/gin-gonic/gin: git ls-remote -q origin in /root/go/pkg/mod/cache/vcs/a923aa3ae357f66c754ef34c3358c689f5d969293b012aef737373496ea3e                   ef3: exit status 128:
      fatal: unable to find remote helper for 'https'
</code></pre>
<p>根据 unable-to-find-remote-helper-for-https-during-git-clone 设置:</p>
<pre><code>$ yum install curl-devel
$ # cd to wherever the source for git is
$ cd /usr/local/src/git-1.7.9
$ ./configure
$ make
$ make install
</code></pre>
<p>由于没找到 git configure 目录,直接 <code>yum remove git</code>,然后 <code>yum install git</code>。接着执行 go mod tidy 报错:</p>
<pre><code>go: finding module for package github.com/gin-gonic/gin
Gin imports
      github.com/gin-gonic/gin: module github.com/gin-gonic/gin: Get "https://proxy.golang.org/github.com/gin-gonic/gin/@v/list": proxyconnect tcp:                  EOF
</code></pre>
<p>看报错信息和代理有关系,重新配置代理,执行 go mod tidy 成功安装 Gin。</p>
<h2 id="5-get-httpsxxx-unexpected-eof">5. <code>Get "https://xxx": unexpected EOF</code></h2>
<p><code>go get -v github.com/rogpeppe/godef</code> 报错:</p>
<pre><code>go get github.com/rogpeppe/godef: module github.com/rogpeppe/godef: Get "https://goproxy.cn/github.com/rogpeppe/godef/@v/list": unexpected EOF
</code></pre>
<p>根据 go get not working with unexpected EOF 取消 https_proxy,重新 go get,成功!</p>
<p>注意:也要留意 http_proxy 的情况,配置 http_proxy 也会遇到此类问题。</p>
<h2 id="6-fatal-unable-to-access-xxx-encountered-end-of-file">6. <code>fatal: unable to access xxx Encountered end of file</code></h2>
<p><code>git clone https://github.com/go-delve/delve</code> 通过 clone 的方式安装 delve,报错:</p>
<pre><code>$ git clone https://github.com/go-delve/delve
Cloning into 'delve'...
fatal: unable to find remote helper for 'https'
</code></pre>
<p>出现了问题 <code>4</code> 一样的报错,但前面已经配置过了为什么还会报错呢?和前面的处理应该没关系。怀疑归怀疑,按照问题 <code>4</code> 的解决方式重新走一遍,报同样的错。</p>
<p>根据 Unable to find remote helper for https 设置 PATH 环境变量:</p>
<pre><code>$ PATH=$PATH:/usr/libexec/git-core
$ git clone https://github.com/go-delve/delve
Cloning into 'delve'...
fatal: unable to access 'https://github.com/go-delve/delve/': Encountered end of file
</code></pre>
<p>现在报 <code>Encountered end of file</code> 错误,根据 fatal: unable to access xxx Encountered end of file 设置 git config:</p>
<pre><code>$ git config --global http.proxy
$ git config --global --unset http.proxy
$ git clone https://github.com/go-delve/delve
Cloning into 'delve'...
warning: You appear to have cloned an empty repository.
</code></pre>
<p>重新 clone 成功。</p>
<h2 id="7-package-embed-is-not-in-goroot-usrlocalgosrcembed">7. <code>package embed is not in GOROOT (/usr/local/go/src/embed)</code></h2>
<p>编译项目代码报错:<code>package embed is not in GOROOT (/usr/local/go/src/embed)</code>。发现 embed 是 golang1.6 的内置函数,当前 golang 版本为 1.4。</p>
<p>遂尝试升级 golang 版本,根据 升级 Golang 尝试实现多版本 golang 管理。在 <code>$GOPATH/pkg/mod/golang.org/dl/</code> 下找到对应<br>
go 版本(如果没有的话需要先下载: <code>go get golang.org/dl/go&lt;version&gt; </code>),编译 main.go 为对应版本号:</p>
<pre><code>$ go build -o go1.16.4 main.go
</code></pre>
<p>执行 <code>./go1.16.4 download</code> 下载 go 软件包:</p>
<pre><code>$ ./go1.16.4 download
go1.16.4: download failed: Head "https://dl.google.com/go/go1.16.4.linux-amd64.tar.gz": dial tcp 142.250.74.78:443: i/o timeout
</code></pre>
<p>遇到了 <code>i/o timeout</code> 问题,查看 go env proxy 是否正确设置:</p>
<pre><code>$ go env | grep proxy -i
GONOPROXY=""
GOPROXY="https://goproxy.cn,direct"

$ go env | grep 111 -i
GO111MODULE="on"
</code></pre>
<p>正确配置,在看这里的 <code>142.250.74.78</code> 是什么地址呢?<br>
通过 wget 直接下载 <code>https://dl.google.com/go/go1.16.4.linux-amd64.tar.gz</code> 看看:</p>
<pre><code>$ wget https://dl.google.com/go/go1.16.4.linux-amd64.tar.gz
--2022-02-20 15:16:34--https://dl.google.com/go/go1.16.4.linux-amd64.tar.gz
Resolving dl.google.com (dl.google.com)... 142.250.74.110, 2a00:1450:400f:802::200e
Connecting to dl.google.com (dl.google.com)|142.250.74.110|:443...
</code></pre>
<p>解析的是域名 <code>dl.google.com</code> 的 ip,众所周知的原因访问不了 google 的服务器。配置代理,继续 wget:</p>
<pre><code>$ export https_proxy=https://10.144.xxx.xxx:8080

$ wget https://dl.google.com/go/go1.16.4.linux-amd64.tar.gz
--2022-02-20 15:30:07--https://dl.google.com/go/go1.16.4.linux-amd64.tar.gz
Connecting to 10.144.xxx.xxx:8080... connected.
Proxy request sent, awaiting response... 200 OK
Length: 129044044 (123M)
Saving to: ‘go1.16.4.linux-amd64.tar.gz’

0% [                                                                                                ] 120,225   36.0KB/seta 68m 14s
</code></pre>
<p>可以访问并下载!</p>
<p>理论上这么走通之后,可以实现多版本 go 管理了。不过这里后续没有走这条路(主要想折腾下多版本 go...),而是将原来的 go 删掉,重新安装新版本 go。</p>
<p>新版本安装完后,执行 <code>go run main.go</code>,程序成功运行。</p>
<h2 id="8-could-not-import-golang-package">8. <code>Could not import Golang package</code></h2>
<p>vscode 提示:<code>Could not import Golang package</code>,原因是前面在升级过程中将 GOPATH 替换了,导致 vscode原有窗口加载的 mod 找不到了。</p>
<p>解决方法是重启 vscode,重新加载 workspace,GOPATH 找到,问题解决。</p>
<h2 id="9-vs-code-remote-connect">9. vs code remote connect</h2>
<p>通过 vs code remote-ssh 远程连接 server。</p>
<p>添加 keypair 到本地。<code>ssh-keygen -t rsa -m PEM -f wenhu.pem</code> 生成 pem 格式密钥。<br>
将以 RSA 开头的密钥拷到本地,并将 OPENSSL 的密码添加到 authorized_keys。</p>
<p>remote-ssh 远程连接成功。</p>
<p>还有种方式是将已经连接成功的 keypair 拷到 server 上,执行类似添加 authorized_keys 操作,连接。</p>
<h2 id="参考">参考</h2>
<ol>
<li>在解决问题过程中,参考了以下资料,效果不错适合参考:</li>
</ol>
<ul>
<li>Why does "go get" use HTTPS when cloning a repository?</li>
<li> Go Modules、Go Module Proxy 和 goproxy.cn </li>
<li>proxy.golang.org: does not work in China</li>
</ul>
<hr>


</div>
<div id="MySignature" role="contentinfo">
    芝兰生于空谷,不以无人而不芳。<br><br>
来源:https://www.cnblogs.com/xingzheanan/p/15700302.html
頁: [1]
查看完整版本: Go 疑难杂症汇总