Go 包管理工具 dep 安裝與使用

bigbug-gg發表於2019-07-21

國內使用 dep 可能同步包會很慢或直接失敗,所以我們要設定代理

新手請直接學習該工具,點選這裡,但如果想試試 dep,本文可作為參考。

  1. 確保您已擁有十八般武藝,能夠自由穿梭 internet
  2. iTerm 支援使 curl, wget , brew 等 應用程式 會呼叫 http_proxy 和 https_proxy 這兩環境變數進行代
  3. Mac 環境下 iTerm 具體操作:

    • 安裝privoxy,作用:使請求轉為http請求從而使用 http代理

      brew install privoxy
    • 設定 http代理

      export http_proxy=http://127.0.0.1:8087
      export https_proxy=$http_proxy
  • 配置privoxy
    vim /usr/local/etc/privoxy/config
    # 寫入
    listen-address 127.0.0.1:8087
    forward-socks5 / 127.0.0.1:1080 .
    forward 192.168.*.*/ .
    forward 10.*.*.*/ .
    forward 127.*.*.*/
    #儲存並啟動privoxy
    brew services start privoxy
  • 代理是否生效,可使用 curl ip.gs,如:
    curl ip.gs
    ...
    Current IP / 當前 IP: 45.**.**.***
    ISP / 運營商:  linode.com
    City / 城市: Dallas Texas
    Country / 國家: United States # 現在使用的美國IP
    ...

    以上是我的實踐過程,您的實踐過程可能會遇到一些問題,別怕,我也是一個一個坑過來的。

  • brew install dep
    brew install dep

如果您之前未使用任何包管理工具,那太好了,不會受其它 包管理思想 影響,如果有其它包使用經驗 比如 npm||
composer,那太好了,可以研究對比下不同思想。

  1. 建立一個專案
    $ mkdir -p $GOPATH/src/github.com/me/example
    $ cd $GOPATH/src/github.com/me/example
  2. 將初始化專案
    $ dep init
    $ ls
    Gopkg.toml Gopkg.lock vendor/
  3. 各個檔案的作用
    • Gopkg.toml 用於調整Gopkg.lock已同步的一些包,如版本高了,在這個檔案設定對應版本,執行命令後,就同步到Gopkg.lock。 有其它包管理工具的注意了composer 的 composer.json 和 npm 的 package.json 不一樣,它不是主要依賴次檔案同步管理包,這個檔案只是作為 調整調整調整!相信您已經記住了。
    • Gopkg.lock 根據專案程式碼裡面的 import 和 Gopkg.toml檔案,獲取相關依賴,最後寫入到 專案 vendor/目錄下。

Go 語言講求沒用到的東西,就不應該存在在程式碼裡面,所以 dep 包管理工具和其它語言的包管理工具不一樣,它根據您專案裡用到什麼第三方包,來生成對應的依賴配置檔案Gopkg.lock,如果配置檔案的軟體包存在問題,則透過Gopkg.toml檔案調整,比如第三方軟體包版本高了,需要指定某個版本,那麼在Gopkg.toml檔案寫入相關配置,然後 透過dep ensure -update -v 更新即可,加 -v 可以看到執行過程資訊。

  1. dep ensure 同步Gopkg.toml檔案修改的配置,加上 -update 則是即同步也更新各個依賴。
  2. dep ensure -add github.com/XXX/XX 新增新依賴項,比如官方文件的例子:
    $ dep ensure -add github.com/pkg/errors

    成功的話,會更新Gopkg.lock檔案和vendor/目錄,並會寫入配置約束github.com/pkg/errors到Gopkg.toml檔案。如果你程式碼裡面沒有用這個第三方依賴包(import),它還會報告一個警告:

    "github.com/pkg/errors" 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/.

    所以,我覺得沒有必要透過這命令來新增依賴,直接在程式碼裡面 import github.com/pkg/errors,再執行 dep ensure 豈不美哉?!

  3. 當之前用過的依賴包,後面程式碼沒再使用過,執行 dep ensure [-update] 會刪除在Gopkg.lock的配置和vendor/裡面的檔案,反之 新新增的包執行後,則會新增到Gopkg.lock的配置和vendor/裡面。
  • required,這等同.go檔案中的import於語句
  • ignored,我的理解是忽略某些依賴包
  • [[constraint]],定義指定依賴的配置規則
  • [[override]],等同於[[constraint]],但它的作用是調整某些依賴包,比如版本下調。
  • [prune],用於管理應從中刪除的檔案型別 vendor/

例:我使用 iris 框架寫 web 專案,結果 iris 包的依賴包升級後出現寫不相容bug,我需要調整依賴包版本,於是我的 Gopkg.toml檔案如下:

...
[[constraint]]
name = "github.com/kataras/iris"
version = "11.1.0"

[[override]]
  name = "github.com/flosch/pongo2"
  branch = "master" # master 分支已修復不相容bug 
...

官方文件,有條件的朋友最好仔細看看該文件。

#檢視當前依賴
$ dep status
Gopkg.lock is out of sync with imports and/or Gopkg.toml. Run `dep check` for details.
PROJECT  MISSING PACKAGES
input-digest mismatch

#排查問題
$ dep check
# Gopkg.lock is out of sync:
github.com/kataras/iris: in Gopkg.lock s input-imports, but neither imported nor required

#同步更新
$ dep ensure -update -v
Warning: the following project(s) have [[constraint]] stanzas in Gopkg.toml:

  ✗  github.com/kataras/iris
  ✗  github.com/pkg/errors

However, these projects are not direct dependencies of the current project:
they are not imported in any .go files, nor are they in the 'required' list in
Gopkg.toml. Dep only applies [[constraint]] rules to direct dependencies, so
these rules will have no effect.

Either import/require packages from these projects so that they become direct
dependencies, or convert each [[constraint]] to an [[override]] to enforce rules
on these projects, if they happen to be transitive dependencies.

Root project is "chuizi"
 1 transitively valid internal packages
 1 external packages imported from 1 projects
(0)   ✓ select (root)
(1) ? attempt github.com/dgrijalva/jwt-go with 1 pkgs; 20 versions to try
(1)     try github.com/dgrijalva/jwt-go@v3.2.0
(2) ✗   github.com/dgrijalva/jwt-go@v3.2.0 not allowed by constraint master:
...
(1)     try github.com/dgrijalva/jwt-go@master
(1) ✓ select github.com/dgrijalva/jwt-go@master w/1 pkgs
  ✓ found solution with 1 packages from 1 projects

Solver wall times by segment:
  b-source-exists: 1.506033451s
  b-list-versions: 1.199125146s
      b-list-pkgs: 168.073552ms
           b-gmal: 146.433008ms
          satisfy:    578.332µs
         new-atom:    307.683µs
      select-root:     86.261µs
      select-atom:     78.903µs
            other:     13.765µs

  TOTAL: 3.020730101s

  #再檢視當前依賴狀態
 $ dep status
PROJECT                      CONSTRAINT     VERSION        REVISION  LATEST   PKGS USED
github.com/dgrijalva/jwt-go  branch master  branch master  5e25c22   5e25c22  1
本作品採用《CC 協議》,轉載必須註明作者和本文連結
現在做的任何事,都是未來的基石,請相信自己的能力。

相關文章