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
等。
go 項目空間
在第一節中介紹了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: [email protected] 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的開發之旅。