当前位置:   article > 正文

2. go的GOPATH、GOROOT、第三方库学习_global gopath和project gopath

global gopath和project gopath


一、GOPATH 和 GOROOT

1.1 GOPATH 和 GOROOT 区别

【参考文章】 > 详解GOROOT和GOPATH

  • GOROOT:golang 的安装路径
  • GOPATH:存放sdk以外的第三方类库;自己收藏的可复用的代码
  • 查看go的安装路径
    在这里插入图片描述
  • goland查看 GOPATH 和 GOROOT,在preference设置中
    在这里插入图片描述
  • Goland里边的 Project GPPATH 和 Global GOPATH
  1. Global GOPATH是所有项目都可以使用的
  2. Project GOPATH是只有这个项目可以使用的

1.2 查看 golang 的环境变量

go env
  • 1

1.3 使用 go run 执行某个文件

  • 运行的代码
package main

import "fmt"

func main() {
	var numbers = make([]int, 3, 5)

	printSlice(numbers)
}

func printSlice(x []int) {
	fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 执行

在这里插入图片描述

二、GOPATH 介绍

go官方的库所在位置就是在GOROOT里面,比如,fmt;而GOPATH就是专门存放第三方套件以供我们程式码的需要。通常开发Golang的话,通常会在重新设定GOPATH的位置

2.1 GOPATH目录

bin
pkg
src
  • 1
  • 2
  • 3

Golang语言的惯例(强制),GOPATH是指src路径的上一层,我们要在GOPATH路径下主动新增src资料夹,所谓src就是代表source code的意思,也就是放我们开发Golang程式码的相关专案的原始码

2.2 GOPATH 使用总结

【参考文章】 > GOPATH 使用总结

go install 和 go 工具会用到 GOPATH;作为编译后二进制的存放目的地 和 import 包时的搜索路径。GOPATH 是一个路径列表,也就是可以同时指定多个目录。多个目录在 Mac 和 Linux 下通过:分割。举例:

export GOROOT=/usr/local/go
export GOPATH=/Users/jianbao/GoglandProjects/beego-api-admin:/Users/jianbao/GoglandProjects/go-study
export PATH=$GOROOT/bin:${GOPATH//://bin:}/bin:$PHP/bin:$PHP/sbin:/usr/local/nginx/sbin:/usr/local/mysql:/usr/local/Cellar/subversion/1.9.4/bin:$PATH
# 注意:亮点是 ${GOPATH//://bin:}/bin, 可一次性添加 所有的 GOPATH 的 bin 目录
  • 1
  • 2
  • 3
  • 4

2.3 引用第三方套件

Go所依赖的所有的第三方库都放在GOPATH这个目录下面,并且,代码开发必须在go path src目录下

  • 使用第三方库的方法
package main
 
import (
    "github.com/gin-gonic/gin"
)
 
func main() {
    router := gin.Default()
    router.Run()
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

import了一个github.com/gin-gonic/gin套件,这个是别人开发的Web Framework套件,是不存在于官方程式库的,而是放在GitHub上的第三方套件。

当执行Golang程式码,当需要存取套件时:

  1. 会先去GOROOT路径下的src资料夹找同等于我们在程式码中import的路径下去找有没有gin这个资料夹,而这资料夹里面就是包含了所有有关于该套件的程式库。
  2. 如果在GOROOT路径下没有找到,则会往GOPATH路径下的src资料夹找同等于我们在程式码中import的路径下去找有没有gin这个资料夹。
  3. 所以只要GOROOT跟GOPATH路径下都没有找到该套件的话,就无法执行该程式码

2.4 GOPATH的缺点

Go所依赖的所有的第三方库都放在GOPATH这个目录下面,下载的依赖包也没有版本概念,这就导致了同一个库只能保存一个版本的代码。如果不同的项目,无法依赖同一个第三方的库的不同版本。第三方套件只要不是官方程式库,都需要放置在GOPATH/src的路径下才可以使用

  • go get

最常用在当我们想用别人公开在GitHub上的套件,可以帮我们从网路上clone到GOPATH/src里面。虽然这样很方便,但是你会发现GOPATH/src下的程式码会很复杂,除了有你自己开发的专案资料夹,也包含其他第三方程式库的专案资料夹。

再来,如果你开发的专案采用第三方套件是不同版本怎么办?以往的解决方法是要设定多组不同的GOPATH

三、go mod介绍和使用

3.1 go mod 介绍

Go.mod是Golang1.11 版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题

  1. Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性。Modules替换旧的基于GOPATH的方法,来指定使用哪些源文件

  2. Modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为Modules,只要其中包含有go.mod文件。

3.2 go mod的关键字

参考文章:Golang | GOROOT、GOPATH、Go-Modules-三者的关系介绍

参考文章:go mod的介绍以及其存在的优势

  • go的版本必须升级到 1.11 以上
  • 设置GO111MODULE的值:
  1. GO111MODULE = off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
  2. GO111MODULE = on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
  3. GO111MODULE = auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
    ① 当前目录在GOPATH/src之外且该目录包含go.mod文件
    ② 当前文件在包含go.mod文件的目录下面。

当modules功能启用时,依赖包的存放位置变更为$GOPATH/pkg

  • go.mod 文件关键字

go.mod 文件内提供了module、 require、replace、exclude四个关键字。

# 关键字
module语句指定包的名字(路径)
require语句指定的依赖项模块
replace语句可以替换依赖项模块
exclude语句可以忽略依赖项模块
# 常用命令
go mod download //下载依赖包
go mode edit        edit go.mod from tools or scripts 编辑go.mod
go mod graph //打印模块依赖图
go mod init        initialize new module in current directory 在当前目录初始化mod
go mod tidy //拉取缺少的模块,移除不用的模块。
go mod vendor //将依赖复制到vendor下
go mod verify      verify dependencies have expected content 验证依赖是否正确
go mod why //解释为什么需要依赖

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • go mod init
  1. 在使用go mod init 模块名称 命令后,会在当前目录下生成一个go.mod文件,之后的包的管理都是通过这个文件管理。
  2. go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件
  3. 会除了go.mod之外,go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希 ,go命令使用go.sum文件确保这些模块的未来下载检索与第一次下载相同的位,以确保项目所依赖的模块不会出现意外更改,无论是出于恶意、意外还是其他原因

采用Go Modules,下载下来的第三方套件都在,GOPATH/pkg/mod资料夹里面

3.3 go mod的使用

参考文章: 知乎go mod使用

  • go env 查看环境变量

  • go help mod 查看使用文档

  • 常用命令

# 开启 MODULE
go env -w GO111MODULE=on
# 开启 MODULE
go env -w GO111MODULE=off
# 开启 MODULE
go env -w GO111MODULE=auto
# 这是带俩默认值为https://proxy.golang.org,direct
go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct
# 设置bin
go env -w GOBIN=/Users/youdi/go/bin
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.4 老项目迁移到用gomod的包管理

  1. 直接运行 go mod init 即可
  2. 如果没有使用任何第三方包管理工具,除了运行 go mod init 初始化以外,还要使用 go get ./…下载安装所有依赖包,并更新 go.mod 和 go.sum 文件。
  3. 默认情况下,go get 命令使用 @latest 版本控制符对所有依赖进行下载,如果想要更改某一个包的版本,可以使用 go mod edit --require=…/…@v版本号 命令
  4. 若已有go.mod文件中的require中已有相关依赖,则直接运行go build 或go run即可自动下载依赖包。

四、项目的目录结构 及 安装技巧

【参考文章】 > go 项目的目录结构 及 安装技巧

bin 存放编译后的可执行文件;
pkg 存放编译后的包文件;
src 存放项目源文件。

一般,bin 和 pkg 目录可以不创建,go 命令会自动创建(如 go install),只需要创建src目录即可。

4.1 安装 Go 第三方包

go get github.com/gin-gonic/gin@v1.5.0
  • 1

Go项目的环境变量GOROOT和GOPATH的设置-那些踩过的坑

4.2 离线安装 Go 第三方

【参考文章】 > 如何安装 第三方 Go 离线包? (GOPATH、 go install)

mkdir src
# 复制 code.google.com.p.go.net.tar.gz 到 src 目录下,解压缩,
cp code.google.com.p.go.net.tar.gz  src && tar -zxvf code.google.com.p.go.net.tar.gz
cd ./src
go install code.google.com/p/go.net/websocket
# 这时候目录下会生成一个 pkg 目录,里面有编译好的 .a 文件,就可以在 go 文件里使用这个包了。 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.3 Goland里边配置project GOPATH 和 global GOPATH案例

参考文章: 详解GOROOT和GOPATH

  1. 在桌面建立一个 src目录 存放类库
  2. 然后在goland 配置Project GOPATH 到桌面即可
  3. 打开桌面的src在kaka目录下创建show.go文件(src/kaka/show.go)
  4. 然后在原本的工程目录下引用即可

show.go文件

package kaka
import "fmt"
func Show(){
	fmt.Println("第三方类库")
}
  • 1
  • 2
  • 3
  • 4
  • 5

使用文件

package main
import "kaka"
func main(){
	kaka.Show()
}
  • 1
  • 2
  • 3
  • 4
  • 5

五、常见问题

在这里插入图片描述
修改代码
在这里插入图片描述
main file has non-main package

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/193462
推荐阅读
相关标签
  

闽ICP备14008679号