如果不设置,直接使用命令创建会报错,如下:
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help mod
01、配置GO111MODULE=on环境变量:配置后,最好是重启一下电脑,以免没有生效,搞得自己很烦。
02、使用命令:go mod init
03、在go.mod文件中添加require:
04、在项目中执行命令:go mod download,执行后会生成go.sum文件:
D:\Go\src\apple> PS D:\Go\src\apple> go mod download go: finding gopkg.in/yaml.v2 v2.2.2 go: finding github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c go: finding github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 go: finding golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 go: finding golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 go: finding golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 go: finding go.opencensus.io v0.20.1 go: finding golang.org/x/exp v0.0.0-20190121172915-509febef88a4 go: finding google.golang.org/grpc v1.19.0 go: finding golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f go: finding golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 go: finding github.com/golang/protobuf v1.2.0 go: finding github.com/googleapis/gax-go/v2 v2.0.4 go: finding github.com/apache/thrift v0.12.0 go: finding github.com/golang/mock v1.2.0 go: finding honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a go: finding cloud.google.com/go v0.34.0 go: finding golang.org/x/net v0.0.0-20180826012351-8a410e7b638d go: finding golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e go: finding honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099 go: finding github.com/google/martian v2.1.0+incompatible go: finding github.com/google/go-cmp v0.2.0 go: finding github.com/hashicorp/golang-lru v0.5.0 go: finding golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be go: finding golang.org/x/sys v0.0.0-20180830151530-49385e6e1522 go: writing stat cache: rename D:\Go\pkg\mod\cache\download\golang.org\x\sys\@v\v0.0.0-20180830151530-49385e6e1522.info689223850.tmp
D:\Go\pkg\mod\cache\download\golang.org\x\sys\@v\v0.0.0-20180830151530-49385e6e1522.info: Access is denied. go: finding github.com/golang/mock v1.1.1 go: finding github.com/openzipkin/zipkin-go v0.1.6 go: finding github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b go: finding cloud.google.com/go v0.26.0 go: finding github.com/client9/misspell v0.3.4 go: finding github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f go: finding google.golang.org/api v0.3.1 go: finding github.com/prometheus/common v0.2.0 go: finding golang.org/x/sync v0.0.0-20181108010431-42b317875d0f go: finding github.com/Shopify/toxiproxy v2.1.4+incompatible go: finding github.com/onsi/ginkgo v1.7.0 go: finding github.com/eapache/go-resiliency v1.1.0 go: finding github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 go: finding github.com/onsi/gomega v1.4.3 go: finding github.com/Shopify/sarama v1.19.0 go: finding golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5 go: finding github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a go: finding github.com/matttproud/golang_protobuf_extensions v1.0.1 go: finding github.com/gorilla/context v1.1.1 go: finding github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d go: finding github.com/pierrec/lz4 v2.0.5+incompatible go: finding golang.org/x/net v0.0.0-20180906233101-161cd47e91fd go: writing go.mod cache: rename D:\Go\pkg\mod\cache\download\github.com\prometheus\procfs\@v\v0.0.0-20181005140218-185b4288413d.mod373518781.tmp
D:\Go\pkg\mod\cache\download\github.com\prometheus\procfs\@v\v0.0.0-20181005140218-185b4288413d.mod: Access is denied. go: finding github.com/gogo/protobuf v1.1.1 go: finding github.com/fsnotify/fsnotify v1.4.7 go: finding gopkg.in/fsnotify.v1 v1.4.7 go: finding github.com/julienschmidt/httprouter v1.2.0 go: finding github.com/go-logfmt/logfmt v0.3.0 go: finding github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 go: finding google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 go: finding github.com/pkg/errors v0.8.0 go: finding golang.org/x/tools v0.0.0-20190226205152-f727befe758c go: finding github.com/sirupsen/logrus v1.2.0 go: finding github.com/go-kit/kit v0.8.0 go: finding github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223 go: finding github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf go: finding github.com/onsi/ginkgo v1.6.0 go: finding github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc go: finding gopkg.in/alecthomas/kingpin.v2 v2.2.6 go: finding golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 go: finding github.com/stretchr/objx v0.1.1 go: finding github.com/konsorten/go-windows-terminal-sequences v1.0.1 go: finding golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 go: finding github.com/hpcloud/tail v1.0.0 PS D:\Go\src\apple> go mod download PS D:\Go\src\apple>
05、查看软件包的版本信息:
go module
是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13
版本开始,go module
将是Go语言默认的依赖管理工具。到今天Go1.14
版本推出之后Go modules
功能已经被正式推荐在生产环境下使用了。
目前已经有很多教程讲解如何使用go module,以及如何使用go module导入gitlab私有仓库,我这里就不再啰嗦了。
最近我发现很多小伙伴在群里问如何使用go module
导入本地包,毕竟初学者刚开始接触package概念的时候都是先在本地创建一个包,然后尝试本地调用一下,但是在go module模式下调用本地包就很容易被卡住了。
本文就详细介绍下如何使用go module
导入本地包。
前提
假设我们现在有moduledemo
和mypackage
两个包,其中moduledemo
包中会导入mypackage
包并使用它的New
方法。
mypackage/mypackage.go
内容如下:
package mypackage import "fmt" func New(){ fmt.Println("mypackage.New") }
我们现在分两种情况讨论:
在同一个项目下
注意:在一个项目(project)下我们是可以定义多个包(package)的。
目录结构
现在的情况是,我们在moduledemo/main.go
中调用了mypackage
这个包。
moduledemo
├── go.mod
├── main.go
└── mypackage
└── mypackage.go
导入包
这个时候,我们需要在moduledemo/go.mod
中按如下定义:
module moduledemo
go 1.14
然后在moduledemo/main.go
中按如下方式导入mypackage
package main import ( "fmt" "moduledemo/mypackage" // 导入同一项目下的mypackage包 ) func main() { mypackage.New() fmt.Println("main") }
举个例子
举一反三,假设我们现在有文件目录结构如下:
└── bubble
├── dao
│ └── mysql.go
├── go.mod
└── main.go
其中bubble/go.mod
内容如下:
module github.com/q1mi/bubble
go 1.14
bubble/dao/mysql.go
内容如下:
package dao import "fmt" func New(){ fmt.Println("mypackage.New") }
bubble/main.go
内容如下:
package main import ( "fmt" "github.com/q1mi/bubble/dao" ) func main() { dao.New() fmt.Println("main") }
不在同一个项目下
目录结构
├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go
导入包
这个时候,mypackage
也需要进行module初始化,即拥有一个属于自己的go.mod
文件,内容如下:
module mypackage
go 1.14
然后我们在moduledemo/main.go
中按如下方式导入:
import ( "fmt" "mypackage" ) func main() { mypackage.New() fmt.Println("main") }
因为这两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod
文件中使用replace
指令。
在调用方也就是packagedemo/go.mod
中按如下方式指定使用相对路径来寻找mypackage
这个包。
module moduledemo go 1.14 require "mypackage" v0.0.0 replace "mypackage" => "../mypackage"
举个例子
最后我们再举个例子巩固下上面的内容。
我们现在有文件目录结构如下:
├── p1
│ ├── go.mod
│ └── main.go
└── p2
├── go.mod
└── p2.go
p1/main.go
中想要导入p2.go
中定义的函数。
p2/go.mod
内容如下:
module liwenzhou.com/q1mi/p2
go 1.14
p1/main.go
中按如下方式导入
import ( "fmt" "liwenzhou.com/q1mi/p2" ) func main() { p2.New() fmt.Println("main") }
因为我并没有把liwenzhou.com/q1mi/p2
这个包上传到liwenzhou.com
这个网站,我们只是想导入本地的包,这个时候就需要用到replace
这个指令了。
p1/go.mod
内容如下:
module github.com/q1mi/p1 go 1.14 require "liwenzhou.com/q1mi/p2" v0.0.0 replace "liwenzhou.com/q1mi/p2" => "../p2"
此时,我们就可以正常编译p1
这个项目了。
说再多也没用,自己动手试试吧。
#############################################