|
如果不设置,直接使用命令创建会报错,如下:
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文件,内容如下:
然后我们在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这个项目了。
说再多也没用,自己动手试试吧。
#############################################
igoodful@qq.com
来源:https://www.cnblogs.com/igoodful/p/14073786.html |