Go | 浅谈包管理模式
任何一门编程语言都离不开对各种工具包的使用,工具包的管理就显得异常重要了。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
文件都需要被加入版本管理中。
总结
GOPATH模式
是 go在 1.5 版本之前的包管理模式,不具备版本控制功能,且所有项目的依赖都放在 GOPATH 里面,管理比较混乱GO MODULE
模式是go在1.11 版本推出的,使用git的管理方式,直接从GitHub上下载所需要的依赖,可能会存在一些安全性问题,同时国内需要设置GOPROXY
代理服务器才可使用,相对来说好用一点。
包管理模式一直是各个开发语言所面临的棘手问题,比如NPM
和Yarn
,设计一种完美的包管理模式还需要不断探索实践。
我是 甜点cc
热爱前端开发,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。
希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。
Go | 浅谈包管理模式的更多相关文章
- 浅谈JS严格模式
浅谈JS严格模式 简介 何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行. 但是,严格模式可以显著提高代码的健壮 ...
- C学习笔记(11)--- 可变参数,浅谈内存管理 【C基础概念系列完结】
1.可变参数(variable arguments): 可变参数允许您定义一个函数,能根据具体的需求接受可变数量的参数. int func(int, ... ) (函数 fun ...
- Linux浅谈磁盘管理及案例
磁盘管理 MBR原理图 从该图可理解到为什么主分区只能是四个. 可以不分区,但为了统一管理,提高访问效率 设备不同,生成设备名称不同 管理分区命令: lsblk查看块设备 fdisk创建MBR分区 f ...
- 浅谈java代理模式
讲解java代理模式 目录 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 代理模式,即Proxy Pattern,23种java常用设计模式 ...
- 浅谈设计模式--组合模式(Composite Pattern)
组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...
- 【python】浅谈包
python中的包可以理解为模块的集合.每个包也既可以为单包也可以有多个小包组成. Python中的package定义很简单,其层次结构与目录的层次结构相同,但是每个package必须包含一个__in ...
- 浅谈jquery插件开发模式
首先根据<jQuery高级编程>的描述来看,jQuery插件开发方式主要有三种: 通过$.extend()来扩展jQuery 通过$.fn 向jQuery添加新的方法 通过$.widget ...
- 【monkeyrunner】浅谈包名和activity名
概念理解 包名:顾名思义,包名即为程序app的包名. activity名:每个界面都是一个activity. 两者关系:一个包有多个activity. Monkeyrunner中 device.sta ...
- 浅谈JavaScript严格模式(use strict)
"use strict" 的目的是指定代码在严格条件下执行. 严格模式下你不能使用未声明的变量. 严格模式声明 严格模式通过在脚本或函数的头部添加 "use strict ...
- 拜拜了,GOPATH君!新版本Golang的包管理入门教程
Go 1.11和1.12实现了对包管理的初步支持,Go的新依赖管理系统使依赖版本信息明确且易于管理.Using Go Modules - The Go Blog 新的包管理模式有什么不同? 作为Go语 ...
随机推荐
- SATA学习笔记——Transport Layer 概述
一.故事前传 在之前的文章中,我们有提到SATA主要包括:应用层(Application Layer), 传输层(Transport Layer),链路层(Link Layer)以及物理层(Physi ...
- 2024年,提升Windows开发和使用体验的实践经验 - RIME输入法
前言 上一篇文章介绍了 Windows 下的包管理器,本文继续介绍输入法. 事实上 Windows 的输入法生态比 Linux/Mac 丰富很多,不过很多国产输入法存在窃取隐私.植入广告.乱安装流氓软 ...
- ElasticSearch入门安装与SpringBoot集成实战
介绍 Elasticsearch 是一个实时分布式搜索和分析引擎,一般用于全文搜索.结构化搜索,分析或者三者混用. 它的底层是基于Apache Lucene(TM)的开源搜索引擎,但是lucene只是 ...
- 【Android逆向】修改so文件方式修改程序行为
1. 还是之前的那个apk 链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an 尝试使用 010Editor来修改so文件 2. 使用 ...
- 逆向实战31——xhs—xs算法分析
前言 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 公众号链接 目标网站 aH ...
- 解析Spring中的循环依赖问题:初探三级缓存
什么是循环依赖? 这个情况很简单,即A对象依赖B对象,同时B对象也依赖A对象,让我们来简单看一下. // A依赖了B class A{ public B b; } // B依赖了A class B{ ...
- 【Azure ACR+App Service】ACR WebHook请求App Service时遇见 401 Unauthorized
问题描述 App Service 支持从ACR中直接拉取镜像,并且可以配置持续部署(Continuous Deployment), 它是通过在ACR中添加一个Webhook,然后发送POST请求到 & ...
- Nebula Graph 源码解读系列 | Vol.00 序言
本文首发于 Nebula Graph Community 公众号 Nebula Graph 是由杭州欧若数网科技有限公司(官网:https://www.vesoft.com/cn/)开源的一款分布式图 ...
- .NET 全能 Cron 表达式解析库(支持 Cron 所有特性)
前言 今天大姚给大家分享一个.NET 全能 Cron 表达式解析类库,支持 Cron 所有特性:TimeCrontab. Cron表达式介绍 Cron表达式是一种用于配置定时任务的时间表达式.它由一系 ...
- [Linux] 无显示器 无键盘 网线直连传输文件
有显示器可以操作 这种情况下要简单的多,基本思想是,网线直连之后让其中一方当作网关,分配好ip地址,比如说192.168.8.1,网关也是192.168.8.1即可,如果要填写子网掩码就写255.25 ...