Golang 的 GOPATH

November 25, 2018
Go

Update

Date:10/08/2019

过了这么久,mudule 应该算是成熟了,基本上正在维护的项目都支持了这个功能。

GOPATH 更多的是作为一个存储依赖代码的地方。甚至不需要 vendor 目录。

对于一个 module,直接使用 go build -ldflags="-s -w" 便可以自动解决依赖并编译。

依赖的下载默认通过 proxy.golang.org ,不过中国不可用,因为政府不允许 UGC (user generate content) 出现在Google 的境内服务器上。不过可以通过设置代理的环境变量解决,或者换一个 GOPROXY 解决。

Rust 打算学但是还没排在计划中,所以情况是咋样的我也不知道。不过我所接触过的比较年轻的语言中,JS与Go感觉在代码的依赖上走上了同一条路。对于 Go,即便有 Google 提供的proxy,感觉依然解决不了某一依赖作者不想维护、某一依赖被人黑 等等依赖不可靠的问题。

用了这么久,其实觉得 Go 的单文件,没动态库其实在部署上蛮爽的。性能上好像看别人的 benchmark 也没差,文件大了点,但是现在连内存空间都肥的很,更别说硬盘了。唯一蛋疼的可能就是涉及到开源许可之类的法律纠纷的问题了。

Date: 10/24/2019

Windows 上不想设置:

set http_proxy=http://127.0.0.1:1080
set https_proxy=http://127.0.0.1:1080

那就只有自己动手丰衣足食喽。

开源的 goproxy 解决方案想了想,看了看,瞅了瞅,觉着好麻烦,于是就想能不能直接反代 Google 的那个算了。

使用 caddy

proxy.example.com:443 {
    timeouts none
    gzip
    proxy /main-proxy https://proxy.golang.org {
        without /main-proxy
    }
    proxy /sum https://sum.golang.org {
        without /sum
    }
    tls {
        alpn h2
        key_type p384
    }
}

然后设置环境变量,改 goproxy 和 gosumdb 那俩就行了。

正文

这学期也是开了不少新坑。

用 GO 的项目挺多的,代表应该就是 docker,kubernetes 了。

鉴于之前被 JavaScript 弄得晕头转向,这次在准备开 goalng 这个新坑之前还是十分谨慎的。

断断续续也算是开始了。

废话这么多,但是开篇就碰到坑也是。。。。

GOPATH

go 需要一个 GOPATH,里面的 bin 存放编译后的。。。(这种废话自己查吧,我不叙述了

总之,GOPATH 就是你的梦魇,按照社区规范的入门教程,你所有的东西都要在 GOPATH 里面。

当然,我第一反应就是,这玩意儿反人类呢?

如果我是一个开发者,我自个儿在社区上的开源项目和在公司写的项目那不得搅和到一堆儿去?

简直屎缸啊。

理想状态

不是说不需要这个 GOPATH,我们可以把它定义为全局依赖。

但是可以随意制定 go project 的目录,并在该目录下可以放属于该 project 的依赖。

编译时优先在 project directory 寻找 dependences,找不到再去 GOPATH 里头翻。

不然,你是打算把 GOPATH 打造成 node_modules 那种辣眼睛的看见就想打人的玩意儿?

社区的态度

本来也是没有这么激进的,但是,社区里面有些人态度就很奇怪。

cmd/go: modify the Go toolchain to work without GOPATH

@inseperable 这位用户。。。简直了有没有,虽然这条 issue 并没有撕逼这种行为,但是总体上,他的发言感觉不是在解决问题,而是在质疑用户的需求,“你的需求没有意义,因为我们一般不会这么用” 这种感觉

The go tool requires GOPATH, it's built into its design and backed by its interpretation of the import statements. They are inseperable.

What is it specifically that you don't like about gb? It seems like its design of a self contained project structure is what you need. How can I help make gb a better fit for your requirements?

注:

后续的我就懒得贴了,耐心地读完这个 thread,golang 内部员工的发言明显更友好

I understand the difference. Hey, listen, I don't want GOPATH either. But I'm also realistic about how fast things move. I'd love to be see it happen sooner than later. Personally I'd like something like git where the “go” command would walk up the tree, looking for a magic …………

vgo / Go modules

这个 issue 提出来也过了很久,真的是很遗憾这玩意儿到最近才 proposal-accept,正式 merge 进 master branch。

废话这么多,言归正传。

由于我本人还在尝试中,所以这里只写我研究出来的部分。详细 Wiki 请移步这里

vgo,又称 go modules 是 golang 用来管理自己的 dependences 的,同时允许了用户在 GOPATH 之外开项目。

创建

go mod init xxxxx

这个时候会在当前目录下创建 go.mod 文件表明自己的名字和依赖。

在目录下执行 go get 之类命令会把 deps 下载到 $GOPATH/pkg/mod 里头去。

并会创建 go.sum 文件作为一个 hash 验证。

暂时未发现 dep 相关的用法,话说回来,我还没用过 dep

PS:其实如果没有设置 mod 的话,没有奇奇怪怪的依赖,是可以直接在当前目录 build 的。

虽然还是屎缸一般的操作,不过至少解决了 deps 冲突的问题。

其余的自个儿去看文档吧,我也不是做翻译的。学计算机的洋文不好还学个 ji bai 。

最后还是吐槽下 VS Code 真难用。白瞎那么好看的 UI 了。

Digging Into Go Routines

April 16, 2019
Go

尝试构建简易 Event Bus

April 12, 2019
Go

Go's Slice Tricks

December 28, 2018
Go
comments powered by Disqus.
Can't load? Check your connectivity and try again.