go语言学习之开发工具使用(二)

922 阅读3分钟

go的文件系统

GOROOT

目的是设置go的安装位置,编译时从GOROOT去找SDK的system library。

GOPATH 必须有以下三个目录:

  • src:存放源代码的目录,比如 .go ,.h,.c
  • pkg:编译后生成的文件,比如 .a 文件,go install后会在该目录生成一个 .a 文件。
  • bin:编译后生成的可执行文件。

Go编译时会从$GOPATH/src 目录查找需要的代码。

当项目需要依赖外部依赖包,go直接通过GOPATH进行管理。go允许import不同代码库的代码,比如 github.com,对于需要 import 的代码,可以使用 go get 命令取下来存放到GOPATH对应的目录中去,比如 $GOPATH/src/github.com下。

因此,对于go来说,并不关心代码是内部的还是外部的,都是从GOPATH获取,任何需要import的包路径都从GOPATH开始。唯一的区别就是,内部依赖的包是项目开发者自己写的,外部依赖包是通过 go get 下来的。

Vendor

vendor是项目文件系统中一个用来存放第三方包的目录,它的作用让go编译时,优先从vendor目录中查找代码如果vendor中有,则不再去GOPATH中找。

要把项目所有的依赖包都拷贝到vendor目录,这样就可以解决下文中提到的全局GOPATH项目空间中第三方包多版本的问题。后文将对go语言中的包管理工具进行展开。go常用的包管理工具有官方的dep以及非官方的glide等。

项目空间

在第一节中介绍了GOPATH,一个项目存在GOPATH目录的下的src目录中,那么怎么管理这个src中项目。这就出现了两种项目文件组织结构

多项目GOPATH集中管理

这种组织形式就是配置全局的GOPATH,在其空间下,建立三个目录,src,bin,pkg,在src项目结构下,建立多个program.

这种方式会导致在引用第三方包,版本不兼容。针对这种问题,在后文中会介绍一种新的方法来解决该问题。

单项目GOPATH独立管理

这种组织形式就是每个项目独立的配置一个GOPATH,保证了workspace的文件形式的独立性。GOPATH直接针对项目设置,在项目空间下,建立src,pkg,bin,三个目录,在src中进行源码的编写。

这种方式,实际上是一种动态的GOPATH环境变量配置。goland编辑器可以支持这种代码组织形式。在创建项目时,需要配置项目级的GOPATH。后文会有具体的设置方式。

在来看下,怎么通过脚本动态的管理GOPATH

CURDIR=`pwd`
OLDGOPATH="$GOPATH"
export GOPATH="$CURDIR"

go开发利器goland使用

Goland是由JetBrains公司旨在为go开发者提供的一个符合人体工程学的新的商业IDE.

来看一下,怎么通过项目GOPATH打造项目开发空间

第一步:创建项目

第二步:配置项目GOPATH

第三步:运行测试

第三方依赖包管理

glide安装

$ go get github.com/Masterminds/glide
$ go install github.com/Masterminds/glide

使用说明

$cd $GOPATH/src/program
$glide init
$ ll
glide.yaml
$ cat glide.yaml 
package: foor
import: []

完整的glide.yaml

package: foor
homepage: https://github.com/qiangmzsx
license: MIT
owners: 
- name: qiangmzsx
  email: qiangmzsx@hotmail.com
  homepage: https://github.com/qiangmzsx
# 去除包
ignore:
- appengine
- golang.org/x/net
# 排除目录
excludeDirs:
- node_modules
# 导入包
import:
- package: github.com/astaxie/beego
  version: 1.8.0
- package: github.com/coocood/freecache
- package: github.com/garyburd/redigo/redis
- package: github.com/go-sql-driver/mysql
- package: github.com/bitly/go-simplejson
- package: git.oschina.net/qiangmzsx/beegofreecache
testImport:
- package: github.com/smartystreets/goconvey
  subpackages:
  - convey

安装依赖

$glide install
$ ll
total 12
glide.lock
glide.yaml
vendor

glide get

最后在来个glide get命令,和go get具有相同的用法,掌握这些知识,就可以像npm一样使用glide了。

总结

本篇内容,通过四大板块,对go语言的文件系统做了介绍,掌握这些知识,就可以开启go的开发之旅。