拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Go语言:包管理基础知识

Go语言:包管理基础知识

白鹭 - 2022-01-23 2079 0 0

起因是,遇到一个问题:

image-20220120165012429

经查阅资料,很可能跟包管理有关,之前有了解过忘了就再学一遍顺便解决问题,

学习资料:

  • GO111MODULE 是个啥? - 知乎 (zhihu.com)
  • go mod使用 - 简书 (jianshu.com)

所谓包管理,比如软件包管理,方便进行软件安装,升级,卸载等一些操作;

Go语言程序中经常会引入其他的package来使用;

Go语言刚开始是并没有包管理相关功能,实作import <packages>时:

  • 我理解是:早期需要啥包,就手动go get什么,
  • go get 命令:会根据路径,把相应的模块获取并保存在$GOPATH/src

Go Modules

Go 1.11 引入Go Modules后:

  • GO111MODULE = off:强制使用GOPATH 方式;
  • GO111MODULE = on:强制使用Go Modules
  • GO111MODULE = auto:
    • 当存在 go.mod 档案时或处于 GOPATH 外, 相当于 GO111MODULE=on,
    • 相当于 Go 1.13 下你可以将所有的代码仓库均不存盘在 GOPATH 下,
    • 当项目目录处于 $GOPATH 内,且没有 go.mod 档案存在时,相当于 GO111MODULE=off,
  • 使用 Go Modules 时,在 go build 期间使用的包存盘在 $GOPATH/pkg/mod 中(而不是GOPATH的$GOPATH/src中),
  • 执行 go run xxx.go 运行代码会发现 go mod 会自动查找依赖自动下载,

到这以后,会考虑到go.mod这个从哪里来,是自己手动创建幺?接着学习go mod;

go mod命令

Go mod 命令是实作Go Modules的工具;就相当于go getGOPATH的关系;

go mod 命令自变量:

image-20220120170844146

图片来源:go mod使用 - 简书 (jianshu.com);常用的是 init,tidy, edit

初始化一个项目;

go mod init xxx

xxx与package名字无关;只是给当前项目用的模块(modules)一个名字;

go.mod档案一旦创建后,它的内容将会被go toolchain全面掌控,go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod档案,

同时还生成了go.sum 其中包含软件包的哈希值,以确保我们具有正确的版本和档案,

go.mod 提供了module, require、replace和exclude 四个go.mod内的关键字:

  • module 陈述句指定包的名字(路径)
  • require 陈述句指定的依赖项模块
  • replace 陈述句可以替换依赖项模块
  • exclude 陈述句可以忽略依赖项模块

解决问题

1 确认GO111MODULE=on:确认了无数次,不仅zsh里配置了,bash里面也配置了;

但用go list是,依旧出现了如下报错,配置的GO111MOUDLE=on未生效,

image-20220120204743960

go env -w GO111MODULE=on

这样之后就好了,

所以我就有一个疑问了,为什么bash组态档中添加的GO111MODULE=on 没生效?

macos,我只用zsh,zshrc中添加了,也source了;甚至bash_profile,profile也都添加了;为什么go env中还需要再设定一遍?很奇怪!

作者:kp-hang 出处:https://www.cnblogs.com/kphang/p/15828097.html " target="_blank"> https://www.cnblogs.com/kphang/p/15828097.html 本文著作权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利,
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *