原创分享 golang 快速入门 [7.1]-项目与依赖管理-gopath

weishixianglian · 2020年03月24日 · 74 次阅读

前文

前言

  • 在之前文章中,我们介绍了 go 语言开发环境的配置
  • 在本章中,我们将介绍 go 语言的项目结构、项目管理以及依赖管理。在本文中,我们关注gopath ## gopath 是什么
  • 在 go 语言开发环境配置文章中,我们介绍了配置gopathgoroot环境变量的步骤,但是并没有对其进行深入解释。可以在终端输入 go env 或者go env gopath查看具体的配置 C:\Windows\system32> go env set GO111MODULE= set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\jackson\AppData\Local\go-build set GOENV=C:\Users\jackson\AppData\Roaming\go\env set GOEXE=.exe set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GONOPROXY= set GONOSUMDB= set GOOS=windows set GOPATH=C:\Users\jackson\go set GOPRIVATE= set GOPROXY=https://proxy.golang.org,direct set GOROOT=c:\go ...
  • 在 go1.8 之后,如果不指定 gopath,则 gopath 是默认的。
    • 在 mac,linux 下为$HOME/go
    • windows 下为%USERPROFILE%\go
  • gopath 可以理解为 go 语言的工作空间,内部存储了src,bin,pkg 三个文件夹

    go/
    ├── bin
    ├── pkg
    └── src
    
  • $GOPATH/bin目录存储了通过go install 安装的二进制文件。操作系统使用 $PATH 环境变量来查找无完整路径即可执行的二进制应用程序。建议将此目录添加到全局 $PATH 变量中

  • $GOPATH/pkg目录中,会存储预编译的 obj 文件 (文件名根据操作系统的不同而不同,例如 mac 下为darwin_amd64),以加快程序的后续编译。大多数开发人员不需要访问此目录。后面还会介绍,pkg 下的 mod 文件还会存储go module的依赖。

  • $GOPATH/src目录 存储我们项目的 go 代码。通常包含许多版本控制存储库(例如,由 Git 管理),每个存储库都包含了一个或多个 package,每个 package 都在一个目录中包含一个或多个 Go 源文件。

  • 因此,整个路径看起来像是:

    go/
    ├── bin
     └── main.exe
    ├── pkg
     ├── darwin_amd64
     └── mod
    └── src
    ├── github.com
    │   ├── tylfin
    │   │   ├── dynatomic
    │   │   └── geospy
    │   └── uudashr
    │       └── gopkgs
    └── golang.org
        └── x
            └── tools
    
  • gopath 具有多个作用,当我们想从 github 或其他地方获取 go 项目代码时,我们可以使用go get指令。 此时程序会默认的将代码存储到$GOPATH/src目录中。例如拉取go get github.com/dreamerjackson/theWayToGolang时,目录结构如下:

    go/
    ├── bin
    ├── pkg
    └── src
    └── github.com
           └── dreamerjackson
                     └── theWayToGolang
    
  • 当我们使用go get-u参数时,会将该项目以及项目所依赖的所有其他项目一并下载到$GOPATH/src目录中

  • gopath 的另一个功能是明确 package 的导入位置。前文我们介绍过,go 代码通过 package 进行组织,在 helloworl 程序中,我们导入了 go 语言内置的fmt package.当我们要导入第三方时应该怎么做呢?其实如果我们在项目中导入了一个第三方包,例如

    import "blue/red"
    

    实际引用的是$GOPATH/src/blue/red 文件中的代码。

同理,如果导入为

import "github.com/gobuffalo/buffalo"

实际引用的是$GOPATH/src/github.com/gobuffalo/buffalo 文件中的代码。

下面我们用一个例子来说明导入第三方包

  • 首先在$GOPATH/src中新建一个文件夹mymath,在文件夹中新建一个文件add.go
» mkdir mymath
» cd mymath
» touch add.go

add.go 的内容如下,要注意导出的函数必须是首字母大写的,这是 go 语言的规则。

package mymath

func Add(a int, b int) int {
    return a + b
}

接着在$GOPATH/src中创建一个 main.go 文件,即可以完整的调用mymath包中的add函数。

package main

import (
    "fmt"
    "mymath"
)

func main() {
    result := mymath.Add(1, 2)
    fmt.Println("result:", result)
}
  • 通过go run main.go 即可运行输出1+2的结果3

gopath 的优劣

  • 相比于其他语言繁琐的配置,go 语言中的工作空间gopath配置相对简单,容易理解
  • gopath 使得在文件系统组织整个代码更加简洁、结构化,但是限制在单一的工作空间中。
  • gopath 并没有解决版本依赖的问题,而将其留给了其他工具去实现。正因为如此,gopath 中的代码就是一个唯一的 master 分支,并且强制使用各个模块最新的代码。

总结

  • 本文介绍了 gopath 的含义、功能、优劣、以及如何通过 GOPATH 来组织项目,导入第三方库。
  • 在 go1.13 之后,go 官方已经开始全面拥抱go module.我们在下文中,将介绍go module的原理和用法,以及如何通过go module进行 go 语言的依赖管理与项目组织。

参考资料

喜欢本文的朋友欢迎点赞分享~

唯识相链启用微信交流群(Go 与区块链技术)

欢迎加微信:ywj2271840211

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册