go mod 是 golang 1.12 推出的包管理工具,具有包依赖管理、版本管理、打包等功能,类似于 Java 生态中的 Maven (不得不说 Maven 真好用)。在使用的过程中遇到了 go mod download 时的 dial tcp 34.64.4.17:443: i/o timeout 问题,这里记录下解决的过程。
关于为什么要使用 go mod,可以参考下这篇文章:开始使用 Go Module - 简书
1、问题来源:引用 go-zookeeper 出现 i/o timeout 问题
我希望在 Golang 程序中使用 zk ,所以需要导入 github.com/samuel/go-zookeeper/zk 这个库,在程序中的导入方式:
package main
import (
_ "github.com/samuel/go-zookeeper/zk"
)
然后在Idea控制台,输入go mod tidy检查所需依赖并进行下载,可以看到已经检查到缺少 zk 依赖,所以使用了go mod download 下载该依赖,然后出现 i/o timeout 的问题:

首先考虑的是被墙了,导致连接超时,所以采用了网上的方案,切换 go 的下载代理:
go env -w GO111MODULE=on // 开启go mod
go env -w GOPROXY=https://goproxy.cn,direct // 切换下载代理
然后在控制台继续执行 go mod tidy, 最后仍然提示: dial tcp 34.64.4.17:443: i/o timeout。
最后折腾了半天,采用 gopm 也没能把依赖下载下来。
但是我使用 Mac 自带的终端进入该目录下执行 go mod tidy 后居然成功了:

2、权限问题:为什么使用 Idea 自身控制台无法执行成功
一开始我使用的是 Idea 自身控制台来执行go mod tidy 这个命令,我们可以看一下,打开一个 Idea 控制台其实是 Idea 进程打开了一个控制台子进程:
打开三个控制台:
通过 top 命令找到 Idea 的 pid 为345, 通过 pstree 命令查看该进程创建的子进程:
~/MyFile/Project/go-mod-test : pstree -p 345
-+= 00001 root /sbin/launchd
\-+= 00345 arong /Applications/IntelliJ IDEA.app/Contents/MacOS/idea -psn_0_65
|--- 00700 arong /Applications/IntelliJ IDEA.app/Contents/bin/fsnotifier
|--- 00768 arong /Applications/IntelliJ IDEA.app/Contents/jbr/Contents/Home/
|--= 00710 arong /bin/zsh --login -i // 默认的命令执行器
|--= 10928 arong /bin/zsh --login -i // 控制台1
|--= 13038 arong /bin/zsh --login -i // 控制台2
\--= 13063 arong /bin/zsh --login -i // 控制台3
总结起来就是:Idea 使用的是/bin/zsh --login -i命令启动一个终端进程来执行程序,所以可能会出现某些权限缺失的问题,这时采用操作系统自身的终端或者在执行go mod tidy命令时外加sudo go mod tidy获取到root权限就可以解决该问题了。
5056



被折叠的 条评论
为什么被折叠?



