带git的项目
➜ gomodtest_base git:(master) ✗ go mod init
go: creating new go.mod: module github.com/e421083458/gomodtest_base
不带git的项目
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
注意点:
cd $GOPATH/pkg/mod
rm -rf *
方法一:
直接修改 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
replace 可以文件夹,也可以是另外一个package
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");
}
go.mod
module new_module_test
require (
github.com/e421083458/gomodtest_base v1.0.1
github.com/e421083458/gomodtest_base/v2 v2.0.0
)
依赖关系:
gomodtest_test|--> gomodtest_dep |--> [email protected]
|--> [email protected]
go mod tidy 时,gomodtest_test会自动更新到与依赖包关联的第三方包相同版本号,并写入到go.mod,从而解决了版本冲突问题。
比如以下场景:
gomodtest_test|--> gomodtest_dep |--> [email protected]
|--> gomodtest_dep2 |--> [email protected]
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
文档引用:
https://www.cnblogs.com/apocelipes/archive/2019/01/20/10295096.html
https://github.com/golang/go/wiki/Modules#semantic-import-versioning
https://www.cnblogs.com/apocelipes/p/9534885.html
https://www.cnblogs.com/apocelipes/p/9537659.html