go module 使用
网站guide
文件下载
go1.14.2.windows-amd64.zip
goland IDE
goland 激活码
配置 环境变量
1.环境变量增加 GOBIN=C:go1.14.2.windows-amd64in
go version
go1.14.2.windows-amd64
输入go version,看到版本信息就ok
2.配置GO111MODULE,GOPROXY
配置GO111MODULE
因为golang将来都会用go mod来进行版本管理,
配置GOPROXY
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
逗号后面可以增加多个 proxy,最后的 direct 则是在所有 proxy 都找不到的时候,直接访问,代理访问不到的私有仓库就可以正常使用了。
https://goproxy.cn,direct
https://goproxy.io,direct
https://mirrors.aliyun.com/goproxy/,direct
详见Go官网说明:
https://github.com/golang/go/wiki/Modules#are-there-always-on-module-repositories-and-enterprise-proxies
因为github的项目代码可能无法下载, 所以要用国内的mirror,这里请务必选择一个代理地址输入
GOPATH 不需要配置,默认(c:userXXXgo)
- linux
`export GO111MODULE=on`
`export GOPROXY=https://goproxy.io`
- windows
1.用`go env`设置环境变量,用Cmd/Powershell/Windows terminal输入(win10测试有效,推荐)
`go env -w GO111MODULE=on`
`go env -w GOPROXY=https://goproxy.io`
2.用set命令设置环境变量(win10测试无效,可能需要管理员权限)
`set GO111MODULE=on`
`set GOPROXY=https://goproxy.io`
tips:
1.linux 可写在`~/.bashrc`、`~/.zshrc`中,
2.windows可用 图形界面配置 环境变量
go env 查看结果
Modules
modules 是什么?
参考 https://gocn.vip/topics/9820
简单说就是包管理,Golang 的包管理素来以混乱著称,以前是依赖 $GOPATH,只要你的代码放在指定路径下就好了,完全没有 “包管理” 的概念。被社区吐槽了很久以后开始搞 vendor 机制,简单来说就是代码不光是可以放到指定路径,还可以放在项目自身路径的 vendor 文件夹。这个解决的问题是:你引用的代码包上游变更不会直接影响你的项目,这显然是开始关心 “包版本” 了。遗憾的是依旧没有解决包管理的问题,比如不同的包依赖了同一个包的不同版本怎么办?版本间代码冲突怎么办?vendor 机制并没有解决,于是围绕 vendor/ 社区就出了几十个包管理工具,一时间百花齐放、百家争鸣、各有所长,导致 golang 的包管理生态变得有些混乱。对这段历史感兴趣的可以阅读下笔者曾经写的文章《Go 包管理的前世今生》。
更有意思的是,在 go 官方社区看到包管理工具的乱象后,也做了个功能类似的工具 dep,原理与其他各类依靠vendor/ 机制的包管理工具类似,准备对包管理做统一。当大家对 dep 工具报以期望并纷纷开始切换到 dep 工具管理依赖包的时候,go 官方又发布了现在的 modules 机制,完全放弃了之前的 dep 工具与 vendor 机制。这样的操作在社区引起了巨大的争议,modules 与 go get、go build 等官方工具生态有很好的集成,官方的意图自然是希望抛开原有的历史包袱,通过全新的方式拯救世界。然而实际体验下来,却依旧不尽如人意。
总的来说大趋势已经是用 modules,go1.13 也对 modules 机制做了不少工作。
言归正传,本文的目标是希望能用 5~10 分钟时间带您学会使用 go modules,然后通过 QA 的形式,描述一些常见的问题。如果希望详细理解相关内容,也可以参考官方文档。
-
GO111MODULE=auto
enables module-mode if any go.mod is found, even inside GOPATH. (Prior to Go 1.13, GO111MODULE=auto would never enable module-mode inside GOPATH).
-
GO111MODULE=off
通过项目下的vendor目录,寻找依赖包(或者GOPATH目录 来查找)
-
GO111MODULE=on
使用modules(GOPATH/pkg 目录下查找)
查看包的所有版本
go list -m -versions rsc.io/sampler
rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99
go help mod
, go mod help
, go help modules
查看help文档
Go mod provides access to operations on modules.
Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.
Usage:
go mod <command> [arguments]
The commands are:
download download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed
go help modules
etc......
goland 配置IDE
打开 goland ide
- welcome界面
[configure] => [setting]
- 项目界面
[file] => [setting]
1.Set Keymap(改成visual studio, vscode)
从market下载vs,vscode后,一定要选择才能使用
(默认是[windows])
因为习惯了VS的按键,所以这个对我来说,挺重要的
2.配置GoRoot(一般不用处理, 会自动识别,从系统环境变量中获取)
3.配置GoPath(一般不用处理, 会自动识别,从系统环境变量中获取)
4.配置GoModules (必须勾选 Enable Go Modules intergration)
测试mod
1.创建main.go文件
package main
import (
"fmt"
"github.com/gogf/gf/os/glog"
//"log"
"rsc.io/quote"
)
func main() {
//mod1
var log = glog.DefaultLogger()
var logDir = "D:/glog"
err := log.SetPath(logDir)
if err != nil {
//fmt.Println("failed 2 SetPath(), logDir =",logDir, "err=",err)
fmt.Printf("failed 2 SetPath(),logDir =%s,err=%s
",logDir,err)
return
}
var s = "test goframe logger: ===>log path=" + log.GetPath()
fmt.Printf(s)
log.Printf(s)
//mod 2
var str = "test "
fmt.Println(str + quote.Hello())
}
2.创建go.mod文件
输入go mod init
或者go mod init awesomeProject
//go.mod 自动生成(我们增加require lib 就行)
module awesomeProject
go 1.14
require rsc.io/quote v1.5.2
require github.com/gogf/gf v1.12.1
依赖包 增加/修改(直接改go.mod, 再执行go mod tidy也行)
go mod edit -require="github.com/xxxx/yyyy @v1.0.2"
//go.sum (自动生成的版本校验hash值,不用关心)
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
...
...
tips:
格式化go.mod文件 go mod edit -fmt
3.使用go mod下载依赖(引用的包默认下载到 C:Usershegopkg)
PS C:UsershegosrcawesomeProject> go mod tidy
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
这样项目管理的依赖包就构建成功了
4.编译
PS C:UsershegosrcawesomeProject>go build -o hello.exe
编译 go build hello.go
运行 hello.exe
显示
test goframe logger: ===>log path=D:/glog2020-04-13 18:31:30.142 test goframe logger: ===>log path=D:/glog
test Hello, world.
然后检查 D:/glog,是否有log信息
5.其他编译选项
go build -mod=vendor
忽略cache里的包,只使用vendor目录里的版本
go build -mod=readonly
此模式任何会导致依赖关系变动的情况都将导致build失败,前面提到过build能查找并更新依赖关系,使用这个选项可以检查依赖关系的变动。