Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

问题:PXF编译中 dep安装与i/o timeout问题 #96

Closed
scarletfrank opened this issue Aug 24, 2020 · 2 comments
Closed

问题:PXF编译中 dep安装与i/o timeout问题 #96

scarletfrank opened this issue Aug 24, 2020 · 2 comments

Comments

@scarletfrank
Copy link

问题描述

增加一段简要说明一下我现在遇到的情况和参考过的链接,因为感觉是两个问题所以开一个新issue。
我现在是在CentOS7上编译Greenplum的PXF组件,我成功安装了Go环境,发现访问源缓慢甚至中断时找到了这个Repo。切换到goproxy.cn之后,安装dep过程中遇到一个子问题1,

[root@xxx Downloads]# go get github.com/golang/dep/cmd/dep
go: finding golang.org/x/sync latest
go: finding golang.org/x/sys latest
go: finding github.com/sdboyer/constext latest
# github.com/golang/dep/gps
/root/go/pkg/mod/github.com/golang/[email protected]/gps/constraint.go:149:4: undefined: semver.Constraint

我通过dep.issue区的一个方法,临时更改GO111MODULE参数为OFF,使得dep安装通过。
之后再改GO111MODULE参数为ON,执行make,编译pxf时遭遇子问题2。pxf的pxf-cli组件部分,看了看是拿go写的,有一个i/o timeout的问题,有时是对text报错,下面这个是对net报错。

(15/20) Wrote github.com/DATA-DOG/[email protected]
(16/20) Failed to write golang.org/x/net@master
(17/20) Failed to write golang.org/x/[email protected]
(18/20) Failed to write golang.org/x/sys@master
(19/20) Failed to write golang.org/x/crypto@master
(20/20) Failed to write golang.org/x/xerrors@master
grouped write of manifest, lock and vendor: error while writing out vendor tree: failed to write dep tree: failed to export golang.org/x/net: unable to deduce repository and source type for "golang.org/x/net": unable to read metadata: unable to fetch raw metadata: failed HTTP request to URL "http://golang.org/x/net?go-get=1": Get http://golang.org/x/net?go-get=1: dial tcp 216.239.37.1:80: i/o timeout
make[1]: *** [depend] Error 1

我参考了 #93
额外补充如下信息

[root@xxx pxf]# GO111MODULE=on GOPROXY=https://goproxy.cn,direct go list -m -json -versions golang.org/x/net@master
go: finding golang.org/x/net master
{
	"Path": "golang.org/x/net",
	"Version": "v0.0.0-20200822124328-c89045814202",
	"Time": "2020-08-22T12:43:28Z"
}

一直都是root环境,网络看起来是正常的。

你确定我们的常见问题页面中没有你想要询问的问题吗?

没有

当你执行 go version 命令后的输出结果是什么?

$ go version

go version go1.13.14 linux/amd64

当你执行 go env 命令后的输出结果是什么?

go env 的输出结果
$ go env

GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/root/go"
GOPRIVATE=""
GOPROXY="https://goproxy.cn"
GOROOT="/usr/lib/golang"
GOSUMDB="off"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build979637767=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

设置环境变量的方式,因为编译前有一个source /app/gpdb/greenplum_path.sh的过程,所以我把环境变量都加到了sh里面。

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
export GO111MODULE=on
export GOPROXY=https://goproxy.cn

我试了即使不在这里加入,手工敲命令使得环境与上面go env一致的情况下,make依然会报错。

  • 我个人感觉还是dep那一步改变量出问题了,子问题1中issue中提到我那个报错跟一个库版本有关,强行指定版本也能fixed。
  • 因为完全没碰过go所以一些命令的含义,我也不太懂...比如go env -w GOPROXY后面跟的内容为啥和export GOPROXY不一样。是go的设置和环境的设置的区别吗,两个需要同时设置吗,我看README切换源的时候也有点蒙

你期望看到的结果是什么?

你实际看到的结果是什么?

@aofei
Copy link
Member

aofei commented Aug 24, 2020

你好,我来回答一下你的问题。

首先,Usage 中所提到的几种对 Go 相关环境变量的不同设置方法本质其实一样的,都只是为了设置环境变量而已。之所以我们推荐使用类似 go env -w GOPROXY=https://goproxy.cn,direct 的这种设置方法,是因为从 Go 1.13 起,对 Go 语言开发者来说用这个方法管理环境变量能更加方便些。你完全可以使用 export GOPROXY=https://goproxy.cn,direct 来替代它,并不影响。至于为什么 Usage 中所提到的 go env -wexport 两种方法后所跟的值不一样,那是因为类似 ,direct 这个功能是 Go 1.13 才发布的,为了保证用户设置后,之前的 Go 版本也可以正常使用,我们才对 export 等方法保留了原有的样子。不过有一点需要注意,如果你同时使用了 go env -wexport 来设置某个环境变量,那么 go 只会采用 export 的那个。换句话说,只有当某个系统变量不存在时,由 go env -w 所设置的对应值才会被采用。

然后,我来说一下 dep。你可能对 Go 依赖管理解决方案的历史还不太了解,简单跟你说一下就是 dep 是由 Go 社区开发者所发起的,曾经一度被认为是 Go 的“官方依赖管理解决方案”,所以社区很多人从它还未被 Go team 正式采纳时就开始使用它了,比如你所提到的 PXF 就是它的一位用户。但不幸的是,Go team 的现任掌舵人 Russ Cox 半路杀出并亲手操刀设计了现在的 Go 官方依赖管理解决方案 Go Modules,所以 dep 算是被正式抛弃了。正是由于这个历史原因才导致了你无法在 GO111MODULE=on 的情况下执行 go get github.com/golang/dep/cmd/dep,也就是无法通过 Go Modules 的方式来安装 dep

最后,给你提供个解决方案,也就是不用 dep,而是直接使用 Go Modules 来达到你的目的。其实也很简单,你只用把这个步骤替换成如下即可:

  1. 切换目录:cd pxf/cli/go/src/pxf-cli
  2. 移除 dep 的相关文件:rm Gopkg.toml Gopkg.lock
  3. 初始化 Go Modules 的相关文件:go mod init pxf-cli
  4. 构建项目:GO111MODULE=on GOPROXY=https://goproxy.cn,direct go build

然后就可以使用同级目录下刚构建好的那个 pxf-cli 二进制程序了。🍻

@scarletfrank
Copy link
Author

晚回复了抱歉,非常感谢如此详细的介绍,我对go的了解仅停留在下载包安装然后HelloWorld的程度= =
按照你的解决方案,我在pxf/cli/go/src/pxf-cli路径下成功编译了pxf-cli程序,没有报错问题,所以不依赖于 dep,而是用Go Modules 是个不错的方法。

不过与此同时也需要修改对应的Makefile,否则还是会去检测dep -v。但改之前,我又看了看整体的make,
default: server external pxf-cli
,所以其实只要make server指定编译一部分直接跳过pxf-cli的编译就行。(与此同时又陷入了gradle访问慢的泥潭)

这个问题我感觉已经完美的解决了,谢谢。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants