go語言依賴管理的多種方式-goget包管理工具被牆辦法


依賴管理以及goget包管理工具被牆辦法

其實我是很喜歡golang這門語言的,易開發,易維護,社區龐大且相對成熟,不過可惜它是谷歌的.

其實谷歌也沒什么,主要是谷歌的東西容易用着用着就不能用了.

最早之前用golang的時候,就發現go get這個命令安裝東西時如果有golang官方的依賴就會發現被牆了,用起來非常的麻煩.不過當時服務器部署在海外,一切都還好.

今天就記錄一下在國內使用包時免FQ的辦法 gopm(gopem項目已經下了,推薦使用go mod)

goproxy的使用以及依賴管理

使用go modgo proxy來做依賴管理go 1.13>=版本推薦使用

依賴管理三個階段GOPATH,GOVENDOR,go mod

  • GOPATH 需要多個版本的時候,GOPATH無法做到,而且所有項目都必須放到這里的話多了之后會很要命.
  • GOVENDOR 什么都要放進去,非常費勁和臃腫.所以社區出了glide等第三方工具幫我們
  • go mod 推薦使用,非常完美,go命令統一管理,用戶不必關心目錄結構,項目也不再必須放在~/go/src/下了
  • go mod下載的包都在~/go/pkg/mod/下存儲

go mod常用命令和設置

go mod download 下載依賴
go mod tidy 同步依賴包,添加需要的,移除多余的
go mod vendor 將依賴包放入項目下的vendor目錄
go get 下載/升級依賴,go mod不再下載源碼進$GOPATH/src,而是在$GOPATH/pkg/mod

注意:
go mod模式不推薦使用vendor目錄,而是直接從cache使用下載的包.

go mod模式默認忽略vendor目錄,可以通過flag-mod=vendor設置為GOFLAGS=-mod=vendor來設置為vendor模式.但是該模式下無法正常使用go get

只通過goproxy來下載依賴使用go 1.13以下版本推薦使用

    1. 僅設置當前窗口本次生效.
      開啟GOPOXY地址即可,go 1.13一下版本沒有GO111MODULE這個變量
export GOPROXY=https://goproxy.cn
    1. 此時就可以直接使用go get命令而不會被牆了,下載的內容還是存儲在GOPATH中

這個包有一個golang.org的依賴如果直接go get是無法下載的.

go get -u -v github.com/aliyun/aliyun-oss-go-sdk/oss

完成

設置GOPROXY地址,開啟go mod

  • 當前窗口生效
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
  • 永久修改
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

# 或者使用下面這個, https://goproxy.cn是七牛雲的項目
go env -w GOPROXY=https://goproxy.io,direct

GOPROXY=https://goproxy.cn,direct 配置`GOPROXY`的地址`direct`代表當`go`在抓取目標模塊時直接去目標模塊的源頭(比如 GitHub) 去抓取
GO111MODULE=on  開啟`go mod`依賴管理功能

如果有不想走proxy的可以這樣設置

# 設置不走 proxy 的私有倉庫,多個用逗號相隔
go env -w GOPRIVATE=*.corp.example.com
# 例如:來自碼雲,gitlab,阿里雲的的代碼不走proxy
go env -w GOPRIVATE=*.gitee.com,code.aliyun.com

此時已可以獲取包了

# 這時候使用go get 去獲取之前下不到的包,會發現非常的快.
 go get -u -v go.uber.org/zap 
  • 后面我們用goland創建項目時會自動在項目下生成一個go.mod文件

go.mod文件內容

module awesome-project  項目名稱

go 1.13  語言的版本
  • awesome-project項目目錄下go get下載所需要的包

此時我們就可以為不同的項目下載不同的包了

# 這時候使用go get 去獲取之前下不到的包,會發現非常的快.
 go get -u -v go.uber.org/zap 
 # 如果要下載指定版本的包只需要在后面@版本號即可
 go get -u -v go.uber.org/zap@v1.11
 # 如果要升級,不指定版本號即可
  go get -u -v go.uber.org/zap
 # 清潔依賴,刪除`go.mod`中沒有被使用的包的條目(不會刪除包文件)
 go mod tidy
 
  • 下載完畢之后會發現go.mod文件已有改變,並且多了一個go.sum文件

go.mod文件內容

module awesome-project 項目名

go 1.13	語言版本
 
require (  
   go.uber.org/atomic v1.5.1 // indirect 代表沒有被用到
  go.uber.org/multierr v1.4.0 // indirect  
  go.uber.org/zap v1.13.0 // indirect  
  golang.org/x/lint v0.0.0-20200130185559-910be7a94367 // indirect  
  golang.org/x/tools v0.0.0-20200206050830-dd0d5d485177 // indirect  
)

go.sum文件的部分內容,里面有各個包的hash和版本號

github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
......
  • 直接在代碼中import沒有下載的包

首次直接編譯會失敗(goland沒事).但同時也會將包下載下來, 再次編譯的時候就沒問題了
.

package main

import "github.com/astaxie/beego"

func main()  {
	beego.Run()
}
  • 再次查看go.mod

發現多了一條beego的記錄,可見go會幫我們自動下載需要的依賴

module awesome-project

go 1.13

require (
	github.com/astaxie/beego v1.12.0 // indirect
	github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
)
  • 之前沒有用go mod現在想用怎么辦?

  • 使用go mod命令來創建go.mod然后再編譯

go mod init module名稱(會自動命名為項目名稱, 一般和項目名保持一致即可)
go build ./...

build過程中每次遇到import都會觸發go modules通過鏡像幫我們拉去所需要的包

# 將當前目錄下所有的go文件全部編譯
go build ./...

# 編譯案例,可以看到build后都已經在下載所需要的包了
go build ./...
go: finding github.com/go-sql-driver/mysql v1.5.0
go: finding github.com/go-xorm/xorm v0.7.9
go: downloading github.com/go-sql-driver/mysql v1.5.0
go: downloading github.com/go-xorm/xorm v0.7.9
go: finding gopkg.in/fatih/set.v0 v0.2.1
go: finding github.com/gorilla/websocket v1.4.1
go: finding github.com/pkg/errors v0.9.1
go: downloading github.com/gorilla/websocket v1.4.1
go: downloading github.com/pkg/errors v0.9.1
go: downloading gopkg.in/fatih/set.v0 v0.2.1
go: extracting github.com/go-sql-driver/mysql v1.5.0
go: extracting github.com/gorilla/websocket v1.4.1
go: extracting github.com/pkg/errors v0.9.1
go: extracting github.com/go-xorm/xorm v0.7.9
go: extracting gopkg.in/fatih/set.v0 v0.2.1

完成

使用vendor

這是一個很短暫的項目,官方在推出vendor支持以后很快就推出了go mod,不建議再用,費勁.

即在項目目錄下新建一個vendor目錄, 將所有依賴的第三方包全部放在vendor下.

go語言會優先在此目錄尋找依賴.

可以看到vendor下面還有vendor,不管有我們的vendor,還有我們引用第三方時,他們自己的vendor

├── vendor
│   ├── config
│   └── github.com
│       ├── aliyun
│       │   └── aliyun-oss-go-sdk
│       │       ├── oss
│       │       └── sample
│       ├── go-sql-driver
│       │   └── mysql
│       ├── julienschmidt
│       │   └── httprouter
│       └── tencentyun
│           └── cos-go-sdk-v5
│               ├── costesting
│               ├── debug
│               ├── example
│               │   ├── batch
│               │   ├── bucket
│               │   ├── object
│               │   ├── service
│               │   └── sts
│               └── vendor
│                   └── github.com
│                       ├── google
│                       │   └── go-querystring
│                       │       └── query
│                       ├── mozillazg
│                       │   └── go-httpheader
│                       └── stretchr
│                           └── testify
│                               ├── _codegen
│                               ├── assert
│                               ├── http
│                               ├── mock
│                               ├── require
│                               ├── suite
│                               └── vendor
│                                   └── github.com
│                                       ├── davecgh
│                                       │   └── go-spew
│                                       │       └── spew
│                                       ├── pmezard
│                                       │   └── go-difflib
│                                       │       └── difflib
│                                       └── stretchr
│                                           └── objx

直接從github下載需要的包到$GOPATH下

沒網的時候可以這么干,但是要注意依賴的依賴,這個問題.

gopm 包管理工具使用(2019年底的開始已經不能用了)

gopm官方文檔

GitHub地址

GitHub中文文檔

官網地址

gopm安裝

go get -v -u github.com/gpmgo/gopm

gopm常用命令

# 查看當前工程依賴
gopm list
# 顯示依賴詳細信息
gopm list -v
# 列出文件依賴
gopm list -t [file]
# 拉取依賴到緩存目錄
gopm get -r xxx
# 僅下載當前指定的包
gopm get -d xxx
# 拉取依賴到$GOPATH
gopm get -g xxx
# 檢查更新所有包
gopm get -u xxx
# 拉取到當前所在目錄
gopm get -l xxx
# 運行當前目錄程序
gopm run
# 生成當前工程的 gopmfile 文件用於包管理
gopm gen -v
# 根據當前項目 gopmfile 鏈接依賴並執行 go install
gopm install -v
# 更新當前依賴
gopm update -v
# 清理臨時文件
gopm clean
# 編譯到當前目錄
gopm bin

gopm使用案例


安裝gopm
go get -v -u github.com/gpmgo/gopm

這是我們回到~/go 中的我們自己的GOPATH的目錄 ls一下

可以看到$GOPATH下的src下多了一個github.com 的目錄,和我們的目錄放在一起
```shell
    ~/go ⌚ 2:06:05
    $ tree -L 2
    .
    ├── bin
    │   └── gopm
    └── src
        ├── github.com
        └── learnGo

這時候我們到~/go/bin/gopm 運行該文件

~/go/bin/gopm get -g -v -u golang.org/x/tools/cmd/goimports

這是安裝成功之后, $GOPATH 下的src中會多一個golang.org的目錄和我們的目錄放在一起

~/go ⌚ 2:19:31
$ tree -L 2
.
├── bin
│   └── gopm
└── src
    ├── github.com
    ├── golang.org
    └── learnGo

很顯然我們在編碼時的目錄也是在src中運行的, bin是可執行文件

在~/go/bin 目錄下執行 go install 安裝goimports 安裝之后會在~/go/bin目錄下生成一個可執行的文件
~/go/bin ⌚ 2:26:38
$ go install  ../src/golang.org/x/tools/cmd/goimports


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM