关于程序员:Go-浅谈包管理模式

2次阅读

共计 2715 个字符,预计需要花费 7 分钟才能阅读完成。

任何一门编程语言都离不开对各种工具包的应用,工具包的治理就显得异样重要了。Go 的包治理形式是逐步演进的,本文介绍 Go 语言的两种包管理模式。

GOPATH 模式引包(不举荐)

在 1.5 版本之前,所有的依赖包都是寄存在 GOPATH 下,没有多版本控制。

go 的编译器会在 $GOPATH/src 上面寻找对应的模块,src 下的每一个目录都能够对应一个模块,目录中的目录也能够是一个模块

上面展现如何在入口文件 main.go 里引入非标准库model 包中的变量

  1. 目录层级如下
├───main
│       main.go
└───model
        utils.go
  • main/main.go 入口文件引入 utils 外面的 Name 变量
  • model/utils.go 文件申明 package model,并定义变量var Name string = "xiao",变量必须是大写,否则报错 name not exported by package model
  1. main.go 文件引 model 包
package main

import (
    "fmt"
    // 引包
  // 省略 GOPATH/src, Go 编译的时候会主动在 src 目录下寻找
    "go_code/pointer/model"
)

func main() {fmt.Println(model.Name) // xiao
}

开启 GO111MODULE 后非 module 我的项目产生的问题

GO111MODULE=on,并且曾经设置GOPATH 的条件下,写的代码在 $GOPATH/src 下,我想要应用另一个 package 外面的内容,并且这个 package 不是规范库,或者说不在 GOROOT 里(个别咱们不会批改 GOROOT 中的内容),编译会报错,如下👇👇

package go_code/pointer/model is not in GOROOT

解决办法一:

设置 GO111MODULE=off

go env -w GO111MODULE=off

设置完之后,go env查看

而后从新编译即可

解决办法二

应用go mod,请看下文介绍👇

GO MODULE 模式引包(举荐)

go modules 是 golang 1.11 新加的个性。

  • 模块是相干 Go 包的汇合
  • modules 是源代码替换和版本控制的单元

go 命令间接反对应用 modules,包含记录和解析对其余模块的依赖性。modules 替换旧的基于 GOPATH 的办法来指定在给定构建中应用哪些源文件。

GO111MODULE 有三个值:off, on 和 auto(默认值)。

  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,容许同一个 package 多个版本并存,且多个我的项目能够 共享缓存 module

利用 GO111MODULEGOPROXY,能够间接将 Github 上的第三方库间接下载到本地应用,不须要应用 go get 命令。执行 go run 运行时,GOMODULES 包管理工具会主动帮咱们下载 github 下面的包

应用 go mod 创立新我的项目

当开启 GO111MODULE 的时候,才能够应用go mod

1、初始化我的项目

mkdir test-mod
cd test-moe
go mod init maze-mod

在我的项目根目录生成 go.mod 文件

module test-mod

go 1.17

require github.com/astaxie/beego v1.12.1

require (
    golang.org/x/net v0.0.0-20190620200207-3b0461eec859 // indirect
    golang.org/x/text v0.3.0 // indirect
)

留神:

  1. indirect 正文的代表 间接依赖 ,没有的代表 间接依赖
  2. 后面是 版本号 + 工夫戳 +hash(如:v0.0.0-20190620200207-3b0461eec859
  1. go.mod文件一旦创立后,它的内容将会被 go toolchain 全面掌控。go toolchain会在各类命令执行时 (比方 go get、go build、go mod 等),批改保护go.mod 文件。
  2. go.mod 提供了 module, require、replace 和 exclude 四个命令

    • module 语句指定包的名字(门路)
    • require 语句指定的依赖项模块
    • replace 语句能够替换依赖项模块
    • exclude 语句能够疏忽依赖项模块

2、增加依赖

  1. 新建 main.go 文件
  2. 执行 go run main.go

    • 一般来说 go mod 模式下,运行 go run 会主动装置所有依赖,然而没有装置
    • 运行 go get ./ ... 能够主动查找并下载安装所有的包
    • 运行 go get [email protected] 装置指定版本的依赖包

3、查看依赖

  • go list -m all 查看以后模块所依赖的包列表
  • go mod tidygo.mod 中移除不须要的依赖

4、go.sum文件

用来做包版本治理

go.sum文件与 go.mod 文件同级。go.sum文件是对导入的依赖包的特定版本的 hash 校验值,作用就是记录第一次下载的依赖版本号,避免有依赖版本升级带来的不兼容问题。所以,go.modgo.sum 文件都须要被退出版本治理中。

总结

  1. GOPATH 模式 是 go 在 1.5 版本之前的包管理模式,不具备版本控制性能,且所有我的项目的依赖都放在 GOPATH 外面,治理比拟凌乱
  2. GO MODULE 模式是 go 在 1.11 版本推出的,应用 git 的治理形式,间接从 GitHub 上下载所须要的依赖,可能会存在一些安全性问题,同时国内须要设置 GOPROXY 代理服务器才可应用,相对来说好用一点。

包管理模式始终是各个开发语言所面临的辣手问题,比方 NPMYarn,设计一种完满的包管理模式还须要一直摸索实际。

我是 甜点 cc

酷爱前端开发,也喜爱专研各种跟本职工作关系不大的技术,技术、产品趣味宽泛且浓重。本号次要致力于分享集体经验总结,心愿能够给一小部分人一些渺小帮忙。

心愿能和大家一起致力营造一个良好的学习气氛,为了集体和家庭、为了我国的互联网物联网技术、数字化转型、数字经济倒退做一点点奉献。数风流人物还看中国、看今朝、看你我。

本文由 mdnice 多平台公布

正文完
 0