|
@@ -23,15 +23,15 @@ export GOBIN=$GOROOT/bin
|
|
|
以下 `GOPATH` 的结构如下:
|
|
|
|
|
|
```
|
|
|
-├── src
|
|
|
- └── github.com
|
|
|
- └── hunterhug
|
|
|
- └── rabbit
|
|
|
- └── a
|
|
|
- └── a.go
|
|
|
- └── main.go
|
|
|
-├── bin
|
|
|
-├── pkg
|
|
|
+├── src
|
|
|
+ └── github.com
|
|
|
+ └── hunterhug
|
|
|
+ └── rabbit
|
|
|
+ └── a
|
|
|
+ └── a.go
|
|
|
+ └── main.go
|
|
|
+├── bin
|
|
|
+├── pkg
|
|
|
```
|
|
|
|
|
|
我们写的开发包有简单易懂的路径之分,比如我的包叫 `github/hunterhug/rabbit`,那么结构如上面一样。
|
|
@@ -87,11 +87,11 @@ func main(){
|
|
|
你再看下 `GOROOT` 的结构:
|
|
|
|
|
|
```
|
|
|
-├── src
|
|
|
- └── time
|
|
|
- └── fmt
|
|
|
-├── bin
|
|
|
-├── pkg
|
|
|
+├── src
|
|
|
+ └── time
|
|
|
+ └── fmt
|
|
|
+├── bin
|
|
|
+├── pkg
|
|
|
```
|
|
|
|
|
|
这不和我们的 `GOPATH` 很像吗,对,现在的 `Golang编译器` 是自编译的,就是用 `Golang` 来写 `Golang编译器`,它的编译器及中间产物,基础库等,保持和 `GOPATH` 一毛一样,无缝衔接。
|
|
@@ -107,13 +107,13 @@ func main(){
|
|
|
比如我们的包叫 `awesomeProject`,在 `GOPATH` 下结构:
|
|
|
|
|
|
```
|
|
|
-├── src
|
|
|
- └── awesomeProject
|
|
|
- └── vendor
|
|
|
- └── fmt
|
|
|
- └── fmt.go
|
|
|
- └── main.go
|
|
|
-├── pkg
|
|
|
+├── src
|
|
|
+ └── awesomeProject
|
|
|
+ └── vendor
|
|
|
+ └── fmt
|
|
|
+ └── fmt.go
|
|
|
+ └── main.go
|
|
|
+├── pkg
|
|
|
```
|
|
|
|
|
|
其中 `main.go`:
|
|
@@ -170,8 +170,8 @@ main.go:4:2: cannot find package "b" in any of:
|
|
|
好了,我们发现现在的加载方式是:
|
|
|
|
|
|
```
|
|
|
-包同目录下的vendor
|
|
|
-GOPATH src 下的vendor
|
|
|
+包同目录下的vendor
|
|
|
+GOPATH src 下的vendor
|
|
|
GOROOT src
|
|
|
GOPATH src
|
|
|
```
|
|
@@ -181,13 +181,13 @@ GOPATH src
|
|
|
好了,现在问题就是 `vendor` 是怎么冒泡的,如果我 `main.go` 引用了 `vendor/b`,而 `b` 包里面引用了一个 `c` 包。此时 `vendor/b` 会怎么找库?
|
|
|
|
|
|
```
|
|
|
-├── src
|
|
|
- └── awesomeProject
|
|
|
- └── vendor
|
|
|
- └── b
|
|
|
- └── b.go
|
|
|
- └── main.go
|
|
|
-├── pkg
|
|
|
+├── src
|
|
|
+ └── awesomeProject
|
|
|
+ └── vendor
|
|
|
+ └── b
|
|
|
+ └── b.go
|
|
|
+ └── main.go
|
|
|
+├── pkg
|
|
|
```
|
|
|
|
|
|
现在 `vendor/b/b.go` 的内容:
|
|
@@ -216,8 +216,8 @@ vendor/b/b.go:3:8: cannot find package "c" in any of:
|
|
|
现在加载流程是:
|
|
|
|
|
|
```
|
|
|
-包同目录的包(即b包同目录看看有没有c包)
|
|
|
-GOPATH src 下的vendor
|
|
|
+包同目录的包(即b包同目录看看有没有c包)
|
|
|
+GOPATH src 下的vendor
|
|
|
GOROOT src
|
|
|
GOPATH src
|
|
|
```
|
|
@@ -225,14 +225,14 @@ GOPATH src
|
|
|
此时我们在 `vendor/b` 下建一个空 `vendor`:
|
|
|
|
|
|
```
|
|
|
-├── src
|
|
|
- └── awesomeProject
|
|
|
- └── vendor
|
|
|
- └── b
|
|
|
- └── vendor
|
|
|
- └── b.go
|
|
|
- └── main.go
|
|
|
-├── pkg
|
|
|
+├── src
|
|
|
+ └── awesomeProject
|
|
|
+ └── vendor
|
|
|
+ └── b
|
|
|
+ └── vendor
|
|
|
+ └── b.go
|
|
|
+ └── main.go
|
|
|
+├── pkg
|
|
|
```
|
|
|
|
|
|
进入 `awesomeProject` 项目再 `go build` 会出现:
|
|
@@ -249,17 +249,17 @@ vendor/b/b.go:3:8: cannot find package "c" in any of:
|
|
|
如果我们再满足上面的 `c` 包,同理在 `c` 包建一个空 `vendor` :
|
|
|
|
|
|
```
|
|
|
-├── src
|
|
|
- └── awesomeProject
|
|
|
- └── vendor
|
|
|
- └── b
|
|
|
- └── vendor
|
|
|
- └── c
|
|
|
- └── vendor
|
|
|
- └── c.go
|
|
|
- └── b.go
|
|
|
- └── main.go
|
|
|
-├── pkg
|
|
|
+├── src
|
|
|
+ └── awesomeProject
|
|
|
+ └── vendor
|
|
|
+ └── b
|
|
|
+ └── vendor
|
|
|
+ └── c
|
|
|
+ └── vendor
|
|
|
+ └── c.go
|
|
|
+ └── b.go
|
|
|
+ └── main.go
|
|
|
+├── pkg
|
|
|
```
|
|
|
|
|
|
但 `c` 包 `c.go` 引用了不存在的 `d` 包:
|
|
@@ -292,11 +292,10 @@ vendor/b/vendor/c/c.go:3:8: cannot find package "d" in any of:
|
|
|
所以现在的加载流程是:
|
|
|
|
|
|
```
|
|
|
-包同目录下的vendor
|
|
|
-包目录向上的最近的一个vendor
|
|
|
+包同目录下的vendor
|
|
|
+包目录向上的最近的一个vendor
|
|
|
...
|
|
|
-
|
|
|
-GOPATH src 下的vendor
|
|
|
+GOPATH src 下的vendor
|
|
|
GOROOT src
|
|
|
GOPATH src
|
|
|
```
|
|
@@ -391,7 +390,7 @@ build github.com/hunterhug/hello: cannot load c: open /home/love/awesomeProject/
|
|
|
现在我们来正确使用 `go mod`, 一般情况下:
|
|
|
|
|
|
```
|
|
|
-省略N步
|
|
|
+省略N步
|
|
|
```
|
|
|
|
|
|
到了这里,我们很遗憾的说再见了,现在 `go mod` 刚出来, 可能还会再更新,您可以谷歌或者其他方式搜索这方面的文章,或者:
|