GOPATH的基本概念
在go语言中GOPATH的变量如果不设置会被默认设置为$HOME/go
我们可以通过命令查看go的环境变量
go env
因此查看GOPATH,就为
go env |grep GOPATH
如果使用GOPATH的工程结构,需要检查是否关闭了go module,否则go在编译的时候会忽略$GOPATH
文件夹。
通过命令查看go module 是否关闭
go env |grep GO111MODULE
为off就说明没有开启go module
设置GOPATH
我们在使用GOPATH的工程结构时,都要对不同的项目设置GOPATH,因此到工程src所在目录执行:
export GOPATH=`pwd`
使用反引号` 将 pwd 指令括起来表示命令行替换,也就是说,使用`pwd`将获得 pwd 返回的当前目录的值
假设我们已经使用
mkdir -p src/hello
创建了一个项目,且src位于$GOPATH
目录之下,并且在hello目录下已存在一个main.go文件,那么可以直接使用命令来生成可执行文件,并且可执行文件会存放到$GOPATH/bin
目录下
go install hello
之后直接运行可执行文件即可。
在多项目工程中使用GOPATH的问题
可能开发人员会忘记执行
export GOPATH=`pwd`
来修改GOPATH
的路径。因此全局 GOPATH
的方法可能会导致当前项目错误引用了其他目录的 Go 源码文件从而造成编译输出错误的版本或编译报出一些无法理解的错误提示。
建议无论是使用命令行或者使用集成开发环境编译 Go 源码时,GOPATH
跟随项目设定。在 Jetbrains 公司的 GoLand 集成开发环境(IDE)中的 GOPATH 设置分为Global GOPATH
和Project GOPATH
。
Global GOPATH
代表全局 GOPATH,一般来源于系统环境变量。Project GOPATH
代表项目所使用的 GOPATH,在创建项目的时候设置,会被保存到.idea目录中,不会被设置到环境变量的 GOPATH 中,但会在编译时使用到这个目录,建议在开发时只填写项目 GOPATH,每一个项目尽量只设置一个 GOPATH。
编译运行GOPATH项目脚本
上面说了在多项目工程中,忘记修改GOPTH可能会引发错误引用其他目录的Go源码文件。一般可以通过以下脚本来编译项目,避免忘记修改GOPATH
编译/运行脚本#!/usr/bin/env bash
CURRENT_DIR=`pwd`
OLD_GO_PATH="$GOPATH" #例如: /usr/local/go
# 修改GOPATH为当前路径
export GOPATH="$CURRENT_DIR"
# 创建GOBIN
GOBIN="$GOPATH/bin"
# 规范化源码格式
gofmt -w src
# 编译安装项目
go install $1
# 运行脚本
$GOBIN/$1
# 恢复
export GOPATH="$OLD_GO_PATH"
GO目前有更好的包管理方式:go mod
使用go mod
首先需要做的是设置export GO111MODULE=on
go env -w GO111MODULE=on
# go v1.13之后需要额外配置
export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=off
开启了GOMODULE模式后,go语言编译的时候就会忽略原来的GOPATH路径,只根据go.mod文件对项目进行编译。
一般直接创建一个目录,然后直接初始化项目即可
mkdir /hello
cd hello
go mod init hello
会生成在../hello/
路径下生成一个go.mod文件
module hello
go 1.16