Go语言包管理模式示例分析
作者:甜点cc 发布时间:2024-05-22 10:20:17
任何一门编程语言都离不开对各种工具包的使用,工具包的管理就显得异常重要了。Go 的包管理方式是逐渐演进的,本文介绍Go语言的两种包管理模式。
GOPATH模式引包(不推荐)
在 1.5 版本之前,所有的依赖包都是存放在 GOPATH
下,没有多版本控制。
go的编译器会在 $GOPATH/src
下面寻找对应的模块,src
下的每一个目录都可以对应一个模块,目录中的目录也可以是一个模块
下面展示如何在入口文件main.go
里引入非标准库model
包中的变量
目录层级如下
├───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
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 module 介绍
go modules 是 golang 1.11 新加的特性。
模块是相关Go包的集合
modules是源代码交换和版本控制的单元
go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
GO111MODULE 有三个值:off, on和auto(默认值)。
GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找(也就是本文最开始介绍的方式)。
GO111MODULE=on,go命令行会使用modules,不会去GOPATH目录下查找所引用的包。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
当前目录在
GOPATH/src
之外且该目录包含go.mod文件当前文件在包含go.mod文件的目录下面。
当modules功能启用时,依赖包的存放位置变更为$GOPATH/pkg
,允许同一个package多个版本并存,且多个项目可以共享缓存的 module
利用GO111MODULE
和GOPROXY
,可以直接将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
)
注意:
有indirect
注释的代表间接依赖,没有的代表直接依赖,
前面是版本号+时间戳+hash(如:v0.0.0-20190620200207-3b0461eec859
)
go.mod
文件一旦创建后,它的内容将会被go toolchain
全面掌控。go toolchain
会在各类命令执行时(比如go get、go build、go mod等),修改维护go.mod
文件。go.mod
提供了module, require、replace和exclude 四个命令module 语句指定包的名字(路径)
require 语句指定的依赖项模块
replace 语句可以替换依赖项模块
exclude 语句可以忽略依赖项模块
2、添加依赖
新建
main.go
文件执行
go run main.go
一般来说
go mod
模式下,运行go run
会自动安装所有依赖,但是没有安装运行
go get ./ ...
可以自动查找并下载安装所有的包运行
go get package@version
安装指定版本的依赖包
3、查看依赖
go list -m all
查看当前模块所依赖的包列表go mod tidy
从go.mod
中移除不需要的依赖
4、go.sum文件
用来做包版本管理
go.sum
文件与go.mod
文件同级。go.sum
文件是对导入的依赖包的特定版本的hash
校验值,作用就是记录第一次下载的依赖版本号,防止有依赖版本升级带来的不兼容问题。所以,go.mod
和go.sum
文件都需要被加入版本管理中。
来源:https://segmentfault.com/a/1190000042764959


猜你喜欢
- my.ini文件[mysqld]max_allowed_packet = 10M
- 1.引言本文是Python生态系统中一些有用技巧的分享。大多数技巧只是使用标准库中的包,但其他一些技巧会涉及一些第三方包。在开始阅读本文内容
- 1、先说恢复误删单元格的操作场景:不小心把某个cell给cut了,或者删除了单元格(前提不要关闭notebook窗口)。解决方法: 先按Es
- 代码如下:--代码一DECLARE @cc INT SELECT NewsId,ROW_NUMBER() OVER(ORDER
- 实验介绍此次实验帮助大家利用 OpenCV 去读取摄像头的视频流,你可以直接使用笔记本本身的摄像头,也可以用 USB 连接直接的摄像头。如果
- 通用视图1. 前言回想一下,在Django中view层起到的作用是相当于controller的角色,在view中实施的动作,一般是取得请求参
- substr 函数:截取字符串 语法:SUBSTR(string,start, [length])string:表示源字符串,即要
- 本文实例讲述了Python3实现计算两个数组的交集算法。分享给大家供大家参考,具体如下:问题:给定两个数组,写一个方法来计算它们的交集。方案
- 如何检测某个对象是否有某个属性?第一想到的——没错,in:"prop" in obj这很完美,不过,还有不少人热衷下面的
- 一、“无”的哲学佛家讲究“因果报应”,有果必有应。此段看似与主题没有血缘关系,实际讲的是“因”。我个人比较喜欢老子的道家思想,并喜欢以其思想
- 本文实例讲述了Python处理XML格式数据的方法。分享给大家供大家参考,具体如下:这里的操作是基于Python3平台。在使用Python处
- 在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现
- 目录1 标准化2 归一化3 正则化4 离散化5 白化 机器
- 如下所示:import time首先导入时间模块在程序开始执行的地方写入:start=time.clock()在程序末尾写入:end=tim
- JetBrains网址:https://www.jetbrains.com/shop/eform/students注册成功后,在校期间都可以
- 人工智能是一个很广阔的领域,很多编程语言都可以用于人工智能开发,所以很难说人工智能必须用哪一种语言来开发。选择多也意味着会有优劣之分,并不是
- 本文实例讲述了Python3.5内置模块之time与datetime模块用法。分享给大家供大家参考,具体如下:1、模块的分类a、标准库(Py
- 其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作。那么它是什么操作呢?它就是图像的模糊(滤波)处理。
- 前两天有一位网友问我一个关于Javascript中++操作符的问题,他的代码大致是这样的ADS.addEvent(window,'c
- 通过视图来访问数据,其优点是非常明显的。如可以起到数据保密、保证数据的逻辑独立性、简化查询操作等等。但是,话说回来,SQL Server数据