1. 程式人生 > >Go 依賴管理工具 Dep 的安裝及配置

Go 依賴管理工具 Dep 的安裝及配置

文章目錄

1、背景介紹

隨著 Go 語言的流行,越來越多的公司和開發人員在工作中使用該語言開發專案,上一篇文章

使用 Jenkins 執行 Go 工程構建映象 中,提到使用 go get 命令時,出現的一些列問題,讓人很是抓狂,所以迫切需要一款可以很好管理 Go 依賴的工具。Dep 是 Go 官方依賴管理工具,通過它,我們可以很方便的管理 Go 專案依賴,同時還可以指定私有庫依賴,非常好用。

2、環境、軟體準備

本次演示環境,我是在本機 MAC OS 上操作,以下是安裝的軟體及版本:

  • Dep: v0.4.1
  • Go: 1.10.3

注意:Dep 作為 Go 語言專案的依賴管理工具,那麼需要在本機安裝好 Go 環境,這裡忽略 Go 的安裝過程,詳細過程可參考 Go 官網

文件,這裡著重介紹下 Dep 安裝以及依賴管理配置操作。

3、Dep 安裝

Dep 作為 Go 官方依賴管理工具,它依賴 Go 環境版本 >= 1.9,其安裝方式也很簡單,針對不同的系統環境,安裝方式也不一樣。

3.1、MacOS 系統

針對 MacOS 系統,我們可以採用 HomeBrew 來進行安裝。

# 安裝 dep
$ brew install dep
# 升級 dep
$ brew upgrade dep

安裝完畢後,可以使用 dep version 檢視版本資訊,確認是否正確安裝。

$ dep version
dep:
 version     : v0.4.1
 build date  : 2018-01-27
 git hash    : 37d9ea0
 go version  : go1.9.3
 go compiler : gc
 platform    : darwin/amd64

注意: 這裡最新的 dep 版本已經更新到 v0.5.0 了,我本地安裝的版本 v0.4.1,因為網路問題,我執行升級 Dep 時失敗了。。。不過沒關係,暫時不影響我們使用。

3.2、Linux 等其他系統

針對其他系統,Dep 官網提供了適配指令碼 install.sh 來幫助我們原始碼安裝。

$ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh

3.3、go get 安裝方式

當然,如果上述方式都不支援或者想在開發模式下使用 Dep,那麼可以採用 go get 安裝。

$ go get -u github.com/golang/dep/cmd/dep

4、Dep 配置檔案說明

Dep 安裝完畢,接下來建立一個 Go 測試專案 deptest,執行一下 dep init 操作,看看會出現些啥東西吧!

$ cd $GOPATH/src/
$ mkdir deptest && cd deptest
$ dep init
$ ls -alt
drwxr-xr-x   5 wanyang3  staff  170 10 12 15:53 .
-rw-r--r--   1 wanyang3  staff  286 10 12 15:53 Gopkg.lock
-rw-r--r--   1 wanyang3  staff  666 10 12 15:53 Gopkg.toml
drwxr-xr-x   2 wanyang3  staff   68 10 12 15:53 vendor

我們發現,在當前專案下生成了 Gopkg.lockGopkg.toml 檔案以及 vendor 資料夾,它們三者的關係如下圖:
go-dep

簡單介紹下三者主要作用:

  • Gopkg.toml:是 Dep 依賴管理的主要配置檔案,它既可以根據程式碼自動生成,也可以手動配置。配置檔案中包含 [[constraint]][[override]][prune]requiredignored 等配置項,它們分別有不同作用,詳細可以參考 這裡
  • Gopkg.lock:是 Dep 根據 Gopkg.toml 配置的依賴自動生成的檔案,不需要手工維護。詳細可以參考 這裡
  • vendor:該目錄是 golang 依賴管理目錄,預設會優先載入該目錄的依賴程式碼,Dep 預設會將專案依賴拉取到該目錄。

執行完 dep init 後,預設生成的 Gopkg.toml 檔案如下:

# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
#   name = "github.com/user/project"
#   version = "1.0.0"
#
# [[constraint]]
#   name = "github.com/user/project2"
#   branch = "dev"
#   source = "github.com/myfork/project2"
#
# [[override]]
#   name = "github.com/x/y"
#   version = "2.4.0"
#
# [prune]
#   non-go = false
#   go-tests = true
#   unused-packages = true

[prune]
  go-tests = true
  unused-packages = true

我們可以看到示例檔案中分別包含了幾個關鍵配置項,簡單介紹下各配置項的作用吧!

  • constraintsoverrides 屬於依賴配置規則項,通過它使用者可以配置專案依賴的版本、分支、源資訊等以及依賴項配置繼承傳遞資訊。
  • requiredignored 屬於包管理檢視規則項,通過它使用者可以通過匯入或者排除匯入的路徑來操作匯入的檢視。
  • prune 設定確定將什麼檔案或者目錄視為不必要的,從而從 vendor 目錄中自動刪除。
  • metadata 該項上邊預設檔案沒有顯示,它主要用來使用者自定義 Key-Value 鍵值對,不過 Dep 會忽略這些值。
  • noverify 該項上邊預設檔案也沒有顯示,它主要用來設定跳過 vendor 驗證的專案根目錄列表。

5、使用 Dep 進行依賴管理

接下來,我們來使用 Dep 進行依賴管理。先修改一下 Gopkg.toml,增加一個之前使用過的依賴 astaxie/beego,配置檔案如下:

$ vim Gopkg.toml
# 約束條件
[[constraint]]
  name = "github.com/astaxie/beego"
  # 指定版本,不寫預設拉取最新版本,可不寫
  version = "=1.9.0"
  # 指定分支,不寫預設為 master
  #branch = "master"
  # 修訂,可不寫
  #revision = "beego 1.9.0"
  # 指定來源,也可不寫
   source = "github.com/astaxie/beego"

[prune]
  go-tests = true
  unused-packages = true

接下來,執行一下 dep ensure 命令,來執行同步操作。

$ dep ensure
no dirs contained any Go code

提示說當前目錄沒有任何 Go 程式碼。這裡我們雖然指定了依賴,但還沒有建立 Go 檔案引用呢!那麼建立一個 Go 程式碼引用 beego 包如下。

$ vim main.go
package main

import (
	"fmt"
	"github.com/astaxie/beego"
)

func main() {
	fmt.Println("do call method from github.com/astaxie/beego")
	beego.Run()
}

再次執行一下 dep ensure -v 命令,看下執行結果吧! (注意:建議加上 -v引數會將執行過程打印出來,方便了解其執行原理。)

$ dep ensure -v
Root project is "deptest"
 1 transitively valid internal packages
 1 external packages imported from 1 projects
(0)   ✓ select (root)
(1)	? attempt github.com/astaxie/beego with 1 pkgs; 27 versions to try
(1)	    try github.com/astaxie/[email protected]
(2)	✗   github.com/astaxie/[email protected] not allowed by constraint 1.9.0:
(2)	    1.9.0 from (root)
(1)	    try github.com/astaxie/[email protected]
(2)	✗   github.com/astaxie/[email protected] not allowed by constraint 1.9.0:
(2)	    1.9.0 from (root)
(1)	    try github.com/astaxie/[email protected]
(2)	✗   github.com/astaxie/[email protected] not allowed by constraint 1.9.0:
(2)	    1.9.0 from (root)
(1)	    try github.com/astaxie/[email protected]
(1)	✓ select github.com/astaxie/[email protected] w/9 pkgs
  ✓ found solution with 9 packages from 1 projects

Solver wall times by segment:
  b-source-exists: 16.774759719s
      b-list-pkgs:  241.183443ms
           b-gmal:  167.059009ms
          satisfy:    3.602636ms
      select-atom:    1.005801ms
         new-atom:      505.09µs
  b-list-versions:     353.055µs
      select-root:       70.85µs
       b-pair-rev:      41.997µs
            other:      12.103µs
        b-matches:        7.25µs
   b-pair-version:       2.314µs

  TOTAL: 17.188603267s

(1/1) Wrote github.com/astaxie/[email protected]

根據列印的執行日誌可以看到,其指定版本匹配過程。因為我們上邊指定了 version = "=1.9.0",即限定只能使用 1.9.0 版本,所以 Dep 會逐個匹配版本,直至匹配到為止。這裡提一下 Gopkg.toml 的 version 規則。如果上邊不指定 version = "=1.9.0" 而是 version = "1.9.0",那麼 Dep 會預設會在左側加上 ^ (像這樣 version = "^1.9.0"),它表示的版本區間為 1.9.0 <= version < 2.0.0,它的規則為最左邊的非零位的版本 +1,其他位變為 0(如果非零位為最後一位,則前一位 +1,其他位變為 0),什麼意思呢?看下如下示例:

^1.2.3 區間為 1.2.3 <= X < 2.0.0
^0.2.3 區間為 0.2.3 <= X < 0.3.0
^0.0.3 區間為 0.0.3 <= X < 0.1.0

當然,version 還有更多符號來匹配版本區間值,例如 !=><>=<=-~ 等,詳細配置可以參考 這裡

好了,迴歸正題,執行完畢,我們會發現在 vendor 目錄下自動下載好了指定版本的依賴了。

$ tree -a
.
├── Gopkg.lock
├── Gopkg.toml
├── main.go
└── vendor
    └── github.com
        └── astaxie
            └── beego
                ├── .gitignore
                ├── .gosimpleignore
                ├── .travis.yml
                ├── CONTRIBUTING.md
                ├── LICENSE
                ├── README.md
                ├── admin.go
                ......

如果,我們想修改依賴的 beego 版本,例如升級 beego 版本到 1.9.2,該如何操作呢?很簡單,首先修改 Gopkg.toml 檔案的 [[constraint]] 版本為 version = "=1.9.2",然後執行 dep ensure -update -v 即可。

$ dep ensure -update -v
Root project is "deptest"
 1 transitively valid internal packages
 1 external packages imported from 1 projects
(0)   ✓ select (root)
(1)	? attempt github.com/astaxie/beego with 1 pkgs; 27 versions to try
(1)	    try github.com/astaxie/[email protected]
(2)	✗   github.com/astaxie/[email protected] not allowed by constraint 1.9.2:
(2)	    1.9.2 from (root)
(1)	    try github.com/astaxie/[email protected]
(2)	✗   github.com/astaxie/[email protected] not allowed by constraint 1.9.2:
(2)	    1.9.2 from (root)
(1)	    try github.com/astaxie/[email protected]
(1)	✓ select github.com/astaxie/[email protected] w/9 pkgs
  ✓ found solution with 9 packages from 1 projects

Solver wall times by segment:
  b-source-exists: 4.930954758s
      b-list-pkgs: 4.691861213s
           b-gmal:  216.38495ms
      select-atom:   1.318051ms
       b-pair-rev:   1.303336ms
          satisfy:   1.050234ms
         new-atom:    154.474µs
      select-root:     62.735µs
  b-list-versions:      30.62µs
            other:     24.773µs
        b-matches:       8.54µs
   b-pair-version:      1.467µs

  TOTAL: 9.843155151s

如果,我們想增加一個新的依賴,該怎麼辦呢?三種方法,一是直接在程式碼中 import,然後重新執行 dep ensure -v 會自動增加,二是直接修改 Gopkg.toml 增加新的 [[constraint]] 配置依賴,三是使用 dep ensure -add 命令增加新的依賴,那接下來演示一下第三種方式吧!

$ dep ensure -add github.com/bitly/[email protected]=0.5.0
Fetching sources...

"github.com/bitly/go-simplejson" is not imported by your project, and has been temporarily added to Gopkg.lock and vendor/.
If you run "dep ensure" again before actually importing it, it will disappear from Gopkg.lock and vendor/.

說明一下,這裡 @=0.5.0 指定依賴版本為 0.5.0,可不填,不填預設拉取最新版本。不過列印的日誌提示該依賴未被我們專案引用,如果此時執行 dep ensure,那麼該依賴將會從 Gopkg.lockvendor 目錄刪除。這也是 Dep 的機制之一,自動刪除未被引用的依賴。看下 Gopkg.tomlGopkg.lock 以及 vendor目錄分別增加了什麼內容。

$ cat Gopkg.toml
......
[[constraint]]
  name = "github.com/bitly/go-simplejson"
  version = "=0.5.0"

$ cat Gopkg.lock
......
[[projects]]
  name = "github.com/bitly/go-simplejson"
  packages = ["."]
  revision = "aabad6e819789e569bd6aabf444c935aa9ba1e44"
  version = "v0.5.0" 

$ tree -L 3 vendor/
vendor/
└── github.com
    ├── astaxie
    │   └── beego
    └── bitly
        └── go-simplejson   

可以看到 Dep 自動幫我們修改了配置檔案以及下載指定版本依賴了,非常方便,接下來,在 main.go 檔案中 importgo-simplejson 依賴。

package main

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/bitly/go-simplejson"
)

func main() {
	fmt.Println("do call method from github.com/bitly/go-simplejson")
	strJson := `{"name": "wanyang3", "address": "beijing china"}`
	mapJson, _ := simplejson.NewJson([]byte(strJson))
	name, _ := mapJson.Get("name").String()
	address, _ := mapJson.Get("address").String()
	fmt.Printf("name: %s, address: %s\n", name, address)

	fmt.Println("do call method from github.com/astaxie/beego")
	beego.Run()
}

此時,我們再次執行 dep ensure -v 看下過程,會提示已經同步了,不需要再次拉取依賴。

$ dep ensure -v
Gopkg.lock was already in sync with imports and Gopkg.toml
(1/2) Wrote github.com/bitly/[email protected]
(2/2) Wrote github.com/astaxie/[email protected]

執行一下該程式,看下日誌輸出,妥妥沒問題的。

$ bee run
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.9.1
2018/10/16 11:23:41 INFO     ▶ 0001 Using 'deptest' as 'appname'
2018/10/16 11:23:41 INFO     ▶ 0002 Initializing watcher...
deptest
2018/10/16 11:23:43 SUCCESS  ▶ 0003 Built Successfully!
2018/10/16 11:23:43 INFO     ▶ 0004 Restarting 'deptest'...
2018/10/16 11:23:43 SUCCESS  ▶ 0005 './deptest' is running...
do call method from github.com/bitly/go-simplejson
name: wanyang3, address: beijing china
do call method from github.com/astaxie/beego
2018/10/16 11:23:43.652 [I] http server Running on http://:8080

6、使用 Dep 依賴私有庫配置

上邊演示的都是依賴別人寫好的 github.com 上邊的依賴庫,有些時候,我們可能需要依賴自己開發的或者公司內部開發的依賴庫,存放在公司內部程式碼管理平臺上(例如:Gitlab),但又不想放在 Github 上的時候,Dep 能幫我們搞定嗎?答案是肯定的,Dep 可以配置私有庫依賴。在這之前,我們先來演示一下,如何在專案中依賴自己在 Github 上的開源庫。

6.1 使用 Dep 配置自定義 (Github) 依賴

首先,需要我們去 github 上建立一個 repository ,這裡忽略建立過程,詳細可參考 這裡。這裡我建立一個測試 huwanyang/helloword 倉庫,建立 Go 程式碼如下:

$ vim sayhelloworld.go
package helloworld

import "fmt"

func SayHelloWorld() {
	fmt.Println("Hello world!")
}

func Version() string {
	return "v1.0.0"
}

func SayOther(str string) {
	fmt.Printf("Saying: %s\n", str)
}

然後,在本地測試專案 main.goimport 該依賴庫。注意:這裡我不使用上邊 dep ensure -add 方式新增依賴,來演示一下 Dep 自動增加依賴配置方式。

$ cat main.go
package main

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/bitly/go-simplejson"
	"github.com/huwanyang/helloword"
)

func main() {
	fmt.Println("do call method from github.com/bitly/go-simplejson")
	strJson := `{"name": "wanyang3", "address": "beijing china"}`
	mapJson, _ := simplejson.NewJson([]byte(strJson))
	name, _ := mapJson.Get("name").String()
	address, _ := mapJson.Get("address").String()
	fmt.Printf("name: %s, address: %s\n", name, address)

	fmt.Println("do call method from github.com/huwanyang/helloWord")
	helloworld.SayHelloWorld()
	helloworld.SayOther("go dep test")
	fmt.Printf("Version: %s\n", helloworld.Version())

	fmt.Println("do call method from github.com/astaxie/beego")
	beego.Run()
}

接下來,執行一下 dep ensure -v 命令看下執行過程輸出,看下是否有問題。

$ dep ensure -v
Root project is "deptest"
 1 transitively valid internal packages
 3 external packages imported from 3 projects
(0)   ✓ select (root)
(1)	? attempt github.com/astaxie/beego with 1 pkgs; at least 1 versions to try
(1)	    try github.com/astaxie/[email protected]
(1)	✓ select github.com/astaxie/[email protected] w/9 pkgs
(2)	? attempt github.com/bitly/go-simplejson with 1 pkgs; at least 1 versions to try
(2)	    try github.com/bitly/[email protected]
(2)	✓ select github.com/bitly/[email protected] w/1 pkgs
(3)	? attempt github.com/huwanyang/helloword with 1 pkgs; 1 versions to try
(3)	    try github.com/huwanyang/[email protected]
(3)	✓ select github.com/huwanyang/[email protected] w/1 pkgs
  ✓ found solution with 11 packages from 3 projects

Solver wall times by segment:
     b-source-exists:  8.95597773s
         b-list-pkgs:  637.47607ms
              b-gmal: 535.441868ms
         select-atom:   3.463791ms
     b-list-versions:   1.902083ms
             satisfy:    931.748µs
            new-atom:    208.606µs
         select-root:     95.907µs
               other:     28.605µs
  b-deduce-proj-root:      3.358µs

  TOTAL: 10.135529766s

(1/3) Wrote github.com/huwanyang/[email protected]
(2/3) Wrote github.com/bitly/[email protected]
(3/3) Wrote github.com/astaxie/[email protected]

沒有問題,不過可以看到它跟另外兩個依賴不同的就是,它是拉取了 master 分支,而另外兩個依賴是指定的版本,當然,如果我們給倉庫打一個版本標籤,這裡也可以指定固定版本依賴。看下 Gopkg.tomlGopkg.lock,以及 vendor 目錄分別自動增加了什麼內容。

$ cat Gopkg.toml
# 沒有增加任何配置

$ cat Gopkg.lock
......
[[projects]]
  branch = "master"
  name = "github.com/huwanyang/helloword"
  packages = ["."]
  revision = "3031802d694e616755844a4959c0c42f07333d17"

$ tree -L 3 vendor/
vendor/
└── github.com
    ├── astaxie
    │   └── beego
    ├── bitly
    │   └── go-simplejson
    └── huwanyang
        └── helloword

我們發現 Gopkg.toml 檔案沒有增加任何配置,但是 Gopkg.lock 裡面已經自動增加了依賴配置資訊,Dep 最終是讀取了 Gopkg.lock 裡面的依賴配置。所以這種方式,會出現兩個檔案看起來配置不太一樣。建議大家採用:方式二直接修改 Gopkg.toml 增加新的 [[constraint]] 配置依賴,方式三使用 dep ensure -add 命令增加新的依賴。

6.2 使用 Dep 配置私有庫 (Gitlab) 依賴

接下來,繼續演示如何使用 Dep 配置私有庫依賴。因為公司採用的是 Gitlab 作為程式碼管理倉庫,那麼我們就在 Gitlab 上建立一個依賴庫,專案名稱依舊為 helloword,專案地址為 http://gitlab.xxx.com/wanyang3/helloword.git,這裡忽略建立過程,詳細可參考 這裡,建立 Go 程式碼如下:

$ vim helloword.go
package helloworld

import "fmt"

func SayHelloWorld() {
	fmt.Println("Gitlab Hello world!")
}

func Version() string {
	return "v2.0.0"
}

func SayOther(str string) {
	fmt.Printf("Gitlab Saying: %s\n", str)
}

然後,修改 Gopkg.toml 檔案,增加私有依賴配置如下。

$ vim Gopkg.toml
......
[[constraint]]
  name = "gitlab.xxx.com/wanyang3/helloword"
  branch = "master"
  source = "http://gitlab.xxx.com/wanyang3/helloword.git"

這裡提一下,我指定了 [[constraint]] 下邊的 source 欄位為上邊建立的私有庫依賴專案地址,目的就是讓 Dep 去指定的源獲取依賴。接下來,我們在 main.go 檔案中 import 該庫。

package main

import (
	"github.com/astaxie/beego"
	"github.com/bitly/go-simplejson"
	gitlab "gitlab.xxx.com/wanyang3/helloword"
	github "github.com/huwanyang/helloword"
	"fmt"
)

func main() {
	fmt.Println("1. do call method from github.com/bitly/go-simplejson")
	strJson := `{"name": "wanyang3", "address": "beijing china"}`
	mapJson, _ := simplejson.NewJson([]byte(strJson))
	name, _ := mapJson.Get("name").String()
	address, _ := mapJson.Get("address").String()
	fmt.Printf("name: %s, address: %s\n", name, address)

	fmt.Println("2. do call method from github.com/huwanyang/helloWord")
	github.SayHelloWorld()
	github.SayOther("go dep test")
	fmt.Printf("Version: %s\n", github.Version())

	fmt.Println("3. do call method from gitlab.xxx.com/wanyang3/helloword")
	gitlab.SayHelloWorld()
	gitlab.SayOther("go dep test")
	fmt.Printf("Version: %s\n", gitlab.Version())

	fmt.Println("4. do call method from github.com/astaxie/beego")
	beego.Run()}

說明一下,因為這裡 githubgitlab 上兩個倉庫包名都為 helloworld,所以 import 之後為了區分二者,我採用別名方式來呼叫。接下來,執行一下 dep ensure -v 命令看下執行過程輸出。

$ dep ensure -v
Root project is "deptest"
 1 transitively valid internal packages
 4 external packages imported from 4 projects
(0)   ✓ select (root)
(1)	? attempt github.com/astaxie/beego with 1 pkgs; at least 1 versions to try
(1)	    try github.com/astaxie/[email protected]
(1)	✓ select github.com/astaxie/[email protected] w/9 pkgs
(2)	? attempt github.com/huwanyang/helloword with 1 pkgs; at least 1 versions to try
(2)	    try github.com/huwanyang/[email protected]
(2)	✓ select github.com/huwanyang/[email protected] w/1 pkgs
(3)	? attempt github.com/bitly/go-simplejson with 1 pkgs; at least 1 versions to try
(3)	    try github.com/bitly/[email protected]
(3)	✓ select github.com/bitly/[email protected] w/1 pkgs
(4)	? attempt gitlab.xxx.com/wanyang3/helloword (from http://gitlab.xxx.com/wanyang3/helloword.git) with 1 pkgs; 1 versions to try
(4)	    try gitlab.xxx.com/wanyang3/helloword (from http://gitlab.xxx.com/wanyang3/helloword.git)@master
(4)	✓ select gitlab.xxx.com/wanyang3/helloword (from http://gitlab.xxx.com/wanyang3/helloword.git)@master w/1 pkgs
  ✓ found solution with 12 packages from 4 projects

Solver wall times by segment:
     b-source-exists: 10.40748019s
         b-list-pkgs: 775.690832ms
              b-gmal: 683.544779ms
             satisfy:   1.088152ms
         select-atom:    899.464µs
            new-atom:    328.243µs
         select-root:    149.888µs
               other:     45.723µs
     b-list-versions:      20.77µs
  b-deduce-proj-root:      6.567µs

  TOTAL: 11.869254608s

(1/4) Wrote github.com/huwanyang/[email protected]
(2/4) Wrote github.com/bitly/[email protected]
(3/4) Wrote gitlab.xxx.com/wanyang3/helloword (from http://gitlab.xxx.com/wanyang3/helloword.git)@master
(4/4) Wrote github.com/astaxie/[email protected]

注意:執行該步驟時,本地 Mac 上會彈出來一個確認框,目的是為了獲取第三方依賴庫許可權認證資訊(當然前提是你第三方依賴庫開啟了許可權認證),因為我本地 git 配置了 credential.helper=osxkeychain 項儲存認證資訊,所以彈出框提示確認從 osxkeychain 獲取認證資訊,點選始終允許即可。如果不是這種配置,應該會出現彈出框讓輸入第三方依賴庫登入賬戶和密碼。

OK 沒有問題,看下 Gopkg.lockvendor 目錄分別自動增加了什麼內容。

$ cat Gopkg.lock
......
[[projects]]
  branch = "master"
  name = "gitlab.xxx.com/wanyang3/helloword"
  packages = ["."]
  revision = "95f80350de8c1f5904dee97a23aa4ce5d6a29761"
  source = "http://gitlab.xxx.com/wanyang3/helloword.git"

$ tree -L 3 vendor/
vendor/
├── gitlab.xxx.com
│   └── wanyang3
│       └── helloword
└── github.com
    ├── astaxie
    │   └── beego
    ├── bitly
    │   └── go-simplejson
    └── huwanyang
        └── helloword

最後,啟動一下該專案,看下日誌輸出是否正確吧! 妥妥沒問題的!

$ bee run
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.9.1
2018/10/16 15:27:27 INFO     ▶ 0001 Using 'deptest' as 'appname'
2018/10/16 15:27:27 INFO     ▶ 0002 Initializing watcher...
deptest/vendor/gitlab.xxx.com/wanyang3/helloword
deptest
2018/10/16 15:27:29 SUCCESS  ▶ 0003 Built Successfully!
2018/10/16 15:27:29 INFO     ▶ 0004 Restarting 'deptest'...
2018/10/16 15:27:29 SUCCESS  ▶ 0005 './deptest' is running...
1. do call method from github.com/bitly/go-simplejson
name: wanyang3, address: beijing china
2. do call method from github.com/huwanyang/helloWord
Hello world!
Saying: go dep test
Version: v1.0.0
3. do call method from gitlab.xxx.com/wanyang3/helloword
Gitlab Hello world!
Gitlab Saying: go dep test
Version: v2.0.0
4. do call method from github.com/astaxie/beego
2018/10/16 15:27:29.764 [I] http server Running on http://:8080

參考資料