配置GOPATH
GOPATH是一个环境变量,用来表明你写的go项目的存放路径,GOPATH路径最好只设置一个,所有的项目代码都放到GOPATH的src目录下。
在windows平台,按照下面的步骤添加到环境变量。例如配置D:\
控制面板->属性->系统高级设置
windows上一般安装完go后,会有gopath,需要设置。
GOPATH填写实际存放代码的地方,即项目目录
在path里添加go的安装目录(D:\go\bin)和GOPATH目录
在gopath目录(D:\GoProject)下新建三个文件夹,bin用来存放编译后生成的可执行文件,pkg用来存放编译后生成的归档文件,src用来存放源码文件
在进行go语言开发的时候,代码一般都是会保存到$GOPATH/src目录下。在工程经过go build、go install或go get等指令后,会将下载的第三方包源代码文件放在$GOPATH/src目录下, 产生的二进制可执行文件放在 $GOPATH/bin目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg 下。
如果我们使用版本管理工具(Version Control System,VCS。常用如Git)来管理我们的项目代码时,我们只需要添加$GOPATH/src目录的源代码即可。bin 和 pkg 目录的内容无需版本控制。
Go程序的编译
在Go语言中,和编译有关的命令主要是go run ,go build , go install这三个命令。
go run只能作用于main包文件,先运行compile 命令编译生成.a文件,然后 link 生成最终可执行文件并运行程序,这过程的产生的是临时文件,在go run 退出前会删除这些临时文件(含.a文件和可执行文件)。最后直接在命令行输出程序执行结果。go run 命令在第二次执行的时候,如果发现导入的代码包没有发生变化,那么 go run 不会再次编译这个导入的代码包,直接进行链接生成最终可执行文件并运行程序。
go install用于编译并安装指定的代码包及它们的依赖包,并且将编译后生成的可执行文件放到 bin 目录下(GOPATH/bin),编译后的包文件放到当前工作区的 pkg 的平台相关目录下。
go build用于编译指定的代码包以及它们的依赖包。如果用来编译非main包的源码,则只做检查性的编译,而不会输出任何结果文件。如果是一个可执行程序的源码(即是 main 包),这个过程与go run 大体相同,除了会在当前目录生成一个可执行文件外。
使用go build时有一个地方需要注意,对外发布编译文件如果不希望被人看到源代码,请使用go build -ldflags 命令,设置编译参数-ldflags “-w -s” 再编译后发布。避免使用gdb来调试而清楚看到源代码。
Go modules包依赖管理
Go 1.11 新增了对模块的支持,希望借此解决“包依赖管理”。可以通过设置环境变量 GO111MODULE来开启或关闭模块支持,它有三个可选值: off、 on、 auto,默认值是 auto。
- GO111MODULE=off
无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。 - GO111MODULE=on
模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod下载依赖。 - GO111MODULE=auto
在 GOPATH/src外面且根目录有 go.mod文件时,开启模块支持。
推荐设置GO111MODULE=auto
#显示go环境配置
go env
#配置go mode
go env -w GO111MODULE=auto
在使用模块的时候, GOPATH是无意义的,不过它还是会把下载的依赖储存在 GOPATH/pkg/mod 中。
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
Use "go help mod <command>" for more information about a command.
命令含义:
download 下载依赖的module到本地cache
edit 编辑go.mod文件
graph 打印模块依赖图
init 在当前文件夹下初始化一个新的module, 创建go.mod文件
tidy 增加丢失的module,去掉未用的module
vendor 将依赖复制到vendor下
verify 校验依赖
why 解释为什么需要依赖
为了使用modules来管理项目,我们可以以下几个步骤来操作:
(1)首先需要设置GO111MODULE ,这里我们设置为auto。
(2)考虑和原来GOPATH有所隔离,新建立了一个目录D:\gomodules来存放modules管理的项目。
(3)在D:\gomodules下建立ind项目,建立对应的目录,D:\gomodules\ind
(4)在ind目录中,我们编写了该项目的主要文件main.go
1、第一次需要我们运行init命令初始化:
D:\gomodules\ind>go mod init ind
go: creating new go.mod: module ind
可以在ind目录看到新生成了一个文件:go.mod ,这个modules名字叫ind。
2、接下来我们运行go mod tidy 命令,发现如下图一样出现报错,这主要是众所周知的网络原因,由于这里主要是golang.org/x下的包,所以可以简单使用replace命令来解决这个问题,如果是其他厂商的依赖包,还是优先解决网络问题。
然后重复运行go mod tidy ,如果出错在使用replace,直到能正常运行go mod tidy 命令完成。
go mod edit -replace=old[@v]=new[@v]
我们看到在ind目录下面多了2个文件,分别是go.mod和go.sum
go.mod文件
module ind
replace (
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01 => github.com/golang/net v0.0.0-20180218175443-cbe0f9307d01
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a => github.com/golang/net v0.0.0-20181114220301-adae6a3d119a
)
require (
github.com/PuerkitoBio/goquery v1.5.0 // indirect
github.com/antchfx/htmlquery v0.0.0-20181207070731-9784ecda34b7 // indirect
github.com/antchfx/xmlquery v0.0.0-20181204011708-431a9e9e7c44 // indirect
github.com/antchfx/xpath v0.0.0-20181208024549-4bbdf6db12aa // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gocolly/colly v1.1.0
github.com/kennygrant/sanitize v1.2.4 // indirect
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea // indirect
)
go.mod文件可以通过require,replace和exclude语句使用的精确软件包集。
(1)require语句指定的依赖项模块
(2)replace语句可以替换依赖项模块
(3)exclude语句可以忽略依赖项模块
go.sum文件
github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk=
github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/antchfx/htmlquery v0.0.0-20181207070731-9784ecda34b7 h1:w7OFcAjjWOJ/Fp9/dlvikG46C44FV/B8G42Tj+KlFUk=
github.com/antchfx/htmlquery v0.0.0-20181207070731-9784ecda34b7/go.mod h1:MS9yksVSQXls00iXkiMqXr0J+umL/AmxXKuP28SUJM8=
github.com/antchfx/xmlquery v0.0.0-20181204011708-431a9e9e7c44 h1:utJNS82e0x9ZhwWvitDlUv2+0HgGYfyrSKX9hDf0uW0=
github.com/antchfx/xmlquery v0.0.0-20181204011708-431a9e9e7c44/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk=
github.com/antchfx/xpath v0.0.0-20181208024549-4bbdf6db12aa h1:lL66YnJWy1tHlhjSx8fXnpgmv8kQVYnI4ilbYpNB6Zs=
github.com/antchfx/xpath v0.0.0-20181208024549-4bbdf6db12aa/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gocolly/colly v1.1.0 h1:B1M8NzjFpuhagut8f2ILUDlWMag+nTx+PWEmPy7RhrE=
github.com/gocolly/colly v1.1.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
github.com/golang/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:98y8FxUyMjTdJ5eOj/8vzuiVO14/dkJ98NYhEPG8QGY=
github.com/golang/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:98y8FxUyMjTdJ5eOj/8vzuiVO14/dkJ98NYhEPG8QGY=
github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea h1:hH8P1IiDpzRU6ZDbDh/RDnVuezi2oOXJpApa06M0zyI=
github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea/go.mod h1:aOux3gHPCftJ3KHq6Pz/AlDjYJ7Y+yKfm1gU/3B0u04=
打开目录GOPATH/pkg/mod,我们可以看到这个项目下的依赖包都下载过来了。
配置goproxy
一般需要设置goproxy,即国内代理,才能正常的下载go模块
#设置阿里云代理
#“direct” 为特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),
#当值列表中上一个 Go module proxy 返回 404 或 410 错误时,Go 自动尝试列表中的下一个,
#遇见 “direct” 时回源,遇见 EOF 时终止并抛出类似 “invalid version: unknown revision…” 的错误。
GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
#不走代理,或者访问私有goproxy
go env -w GOPRIVATE=git.mycompany.com,github.com/my/private
#取消校验
go env -w GOSUMDB=off
常见的国内goproxy