1、golang 1.11的朋友,开启 GO11MODULE=on ,并且确保实验目录不在 GOPATH 中,命令行里执行。
export GO11MODULE=on
export GO111MODULE=on
2、golang 1.12的朋友,确保实验目录不在 GOPATH 中。
3、加速下载,命令行里执行。
export GOPROXY=https://goproxy.io
https://goproxy.io/zh:必看/
1、直接从github上面clone一个项目下来。
2、直接执行 go mod init 会自动生成带git地址的packagename
➜ gomodtest_base git:(master) ✗ go mod init
go: creating new go.mod: module github.com/e421083458/gomodtest_base
1、直接执行
go mod init packagename
go mod download
➜ new_module_test go mod download
go: finding github.com/e421083458/gomodtest_dep v0.0.0-20190501153957-6ff7f41fdb83
go: finding github.com/e421083458/gomodtest_base v1.0.1
go: finding github.com/e421083458/gomodtest_base/v2 v2.0.0
go: finding github.com/jianfengye/collection v0.0.0-20190426092112-28c4a03f0c86
go: finding github.com/pkg/errors v0.8.1
go mod tidy
注意点
1、如果tag对应内容有更新,需要删除pkg中的缓存内容。这点比较恶心了。
cd $GOPATH/pkg/mod
rm -rf *
2、go get、 go run、go build 也会自动下载依赖
方法一: 直接修改 go.mod 文件,然后执行 go mod download
方法二: 使用 go get [email protected],会自动更新 go.mod 文件的
方法三: go run、go build 也会自动下载依赖
go mod vendor
注意: 这里只会下载对应版本的包文件,不会把所有版本下载。跟之前1.11使用方式一致
有时候国外软件可能被墙,这个功能就能派上用场了。
main.go
main.go
package main
import "my/example/pkg"
func main() {
pkg.Hello()
}
go.mod
module my-mod
require my/example/pkg v0.0.0
replace my/example/pkg => ./pkg
module my-mod
require my/example/pkg v0.0.0
replace my/example/pkg => ./pkg
module my-mod
require my/example/pkg v0.0.0
replace my/example/pkg v0.0.0 => github.com/example/pkg v0.0.0
注意点: 顶层依赖可替换但间接依赖不可替换
semver是官方为了类库升级引入的新规范,即:
“If an old package and a new package have the same import path, the new package must be backwards compatible with the old package.” - go modules wiki "
如果旧软件包和新软件包具有相同的导入路径,则新软件包必须向后兼容旧软件包。"
main.go
package main
import (
"fmt"
v1 "github.com/e421083458/gomodtest_base"
v2 "github.com/e421083458/gomodtest_base/v2"
)
func main(){
v2.NewIntCollection("hello","sex")
v1.NewIntCollection("hello")
fmt.Println("hello");
}
依赖关系:
gomodtest_test|--> gomodtest_dep |--> gomodtest_base@v1.0.0
|--> gomodtest_base@v1.0.1
go mod tidy 时,gomodtest_test会自动更新到与依赖包关联的第三方包相同版本号,并写入到go.mod,从而解决了版本冲突问题。
比如以下场景:
gomodtest_test|--> gomodtest_dep |--> gomodtest_base@v1.0.0
|--> gomodtest_dep2 |--> gomodtest_base@v1.0.1
go mod tidy 时,默认使用第一个包引用版本号,[email protected],并写入到go.mod,这个时候就要注意两个版本是否功能完全兼容的问题了。
go mod 遵循了之前go get 自动下载依赖特性。所有的依赖包会自动全部下载。
未启用 go mod 功能的包会自动下载最高 tag 版本或最高 master commit版本
我之前也以为go mod只会自动查询使用了go mod的功能的包。
➜ new_module_test go mod download
go: finding github.com/e421083458/gomodtest_dep v0.0.0-20190501153957-6ff7f41fdb83
go: finding github.com/e421083458/gomodtest_base v1.0.1
go: finding github.com/e421083458/gomodtest_base/v2 v2.0.0
go: finding github.com/jianfengye/collection v0.0.0-20190426092112-28c4a03f0c86
go: finding github.com/pkg/errors v0.8.1