天天看點

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

目錄

GOPATH

go install指令

govendor

go mod

配置

GO111MODULE介紹

指令

使用

GOPROXY介紹

項目目錄

代碼

運作截圖

遠端包

go get指令

參考

GOPATH

  1. 代碼開發必須在go path的src目錄下
  2. 手動管理依賴
  3. 依賴包沒有版本

全是缺點,在本地可以湊合用用

go install指令

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

goinstall和中Go-常用指令go的使用(build、env、run、fmt等)的go build很類似。go install 隻是将編譯的中間檔案放在GOPATH的 pkg 目錄下,以及固定地将編譯結果放在 GOPATH 的 bin 目錄下。

這個指令在内部實際上分成了兩步操作:

  • 第一步是生成結果檔案(可執行檔案或者 .a 包)
  • 第二步會把編譯好的結果移到 $GOPATH/pkg 或者 $GOPATH/bin。

govendor

  1. 解決了包依賴,一個配置檔案即可管理
  2. 依賴包全都下載下傳到項目vendor下,每個項目都有一份

大型項目也不行,備援太多

govendor指令

指令 功能

init

初始化 vendor 目錄

list

列出所有的依賴包

add

添加包到 vendor 目錄,如 govendor add +external 添加所有外部包

add PKG_PATH

添加指定的依賴包到 vendor 目錄

update

從 $GOPATH 更新依賴包到 vendor 目錄

remove

從 vendor 管理中删除依賴

status

列出所有缺失、過期和修改過的包

fetch

添加或更新包到本地 vendor 目錄

sync

本地存在 vendor.json 時候拉去依賴包,比對所記錄的版本

get

類似 

go get

 目錄,拉取依賴包到 vendor 目錄

go mod

  • 一個包可以由多個檔案組成
  • 同一包内不需要導入

配置

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考
Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

GO111MODULE介紹

有三個值:off, on和auto(預設值)。

GO111MODULE=off,go指令行将不會支援module功能,尋找依賴包的方式将會沿用舊版本那種通過vendor目錄或者GOPATH模式來查找。

GO111MODULE=on,go指令行會使用modules,而不會去GOPATH目錄下查找。

GO111MODULE=auto,預設值,go指令行将會根據目前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形:

目前目錄在GOPATH/src之外且該目錄包含go.mod檔案

目前檔案在包含go.mod檔案的目錄下面

指令

go mod

指令 說明
download 下載下傳依賴包
edit 編輯go.mod
graph 列印子產品依賴圖
init 初始化一個新子產品到目前目錄
verify 在目前目錄初始化mod
tidy 拉取缺少的子產品,移除不用的子產品
vendor 将依賴複制到vendor下
verify 驗證依賴是否正确
why 解釋為什麼需要依賴

使用指令

根目錄下生成go.mod檔案

go mod init "包名"

使用

GoLand

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

GOPROXY介紹

Proxy,對應GOPROXY環境變量

proxy.golang.org,中國無法通路,除非你有梯子

goproxy.cn、goproxy.org可以在中國使用,“direct” 是一個特殊訓示符,用于訓示 Go 回源到子產品版本的源位址去抓取(GitHub等),當值清單中上一個 Go 子產品代理傳回 404 或 410 錯誤時,Go 自動嘗試清單中的下一個,遇見 “direct” 時回源,也就是回到源位址去抓取,而遇見 EOF 時終止并抛出 “invalid version: unknown revision...” 的錯誤。

項目目錄

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考
  • add.go中有可導出的函數Add
  • plus.go中使用add.go中的函數Add,來展示同一包内不需要導入
  • sub.go中使用plus.go中的Plus函數,來展示不同包下如何導入
  • Cal.go是入口檔案,package後必須是main,同時含有main方法,導入了包plus和sub

代碼

add.go

package plus

func Add(a,b int)int{
	return a+b
}
           

plus.go

package plus

func Plus(a,b int)int{
	return Add(a,b)
}
           

相同包直接使用

sub.go

package sub

import "modUse/plus"

func Sub(a,b,c int) int{
	return plus.Plus(a,b) - c
}
           

不同包需要導入

Cal.go

package main

import (
	"fmt"
	"modUse/plus"
	"modUse/sub"
)

func main()  {
	a := 10
	b := 20
	fmt.Println(plus.Plus(a,b))
	fmt.Println(sub.Sub(a,b,5))
}
           

main包中導入。使用go mod不用建立main目錄,寫上package main即可。

運作截圖

編譯後運作即可,go run 也行。

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

遠端包

go get指令

使用

go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]

配置好代理,Go-常用指令go的使用(build、env、run、fmt等)中講解env時有代理的設定。

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

遠端包格式如下

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考
  • 網站域名:表示代碼托管的網站,github、gitee等
  • 作者或機構:表明這個項目的歸屬,一般為網站的使用者名。
  • 項目名:每個網站下的作者或機構可能會同時擁有很多的項目,圖中标示的部分表示項目名稱。

 我寫了一個簡單的go包,實作了單連結清單:Go-如何優雅的實作單連結清單?(含全部代碼)

包的網址為:https://gitee.com/frankyu365/datastructure

最新版

go get example.com/pkg

指定版本

go get example.com/[email protected]版本号

删除依賴并降級

go get example.com/[email protected]

更新具體的包

 go get -d golang.org/x/net

go get選項

選項 含義
-v 顯示操作流程的日志及資訊,友善檢查錯誤
-u 下載下傳丢失的包,但不會更新已經存在的包
-d 隻下載下傳更新,不安裝,安裝使用go install
-insecure 允許使用不安全的 HTTP 方式進行下載下傳操作

我一般使用-u -v參數

go get -u -v gitee.com/frankyu365/datastructure
Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

Cal.go改為

package main

import (
	"fmt"
	"modUse/plus"
	"modUse/sub"
	"gitee.com/frankyu365/datastructure/singlelist"
)

func main()  {
	a := 10
	b := 20
	fmt.Println(plus.Plus(a,b))
	fmt.Println(sub.Sub(a,b,5))
	lst := singlelist.New()
	lst.PushBack(7)
	fmt.Println(lst.Front())
}
           

這個時候的go.mod就自動添加了子產品

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

你可以在你的GOPATH下找到這個包

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

運作結果

Go-包管理(管理工具對比及go mod的使用)GOPATHgovendorgo mod問題釋出自己的go包參考

問題

go mod緩存

參考:go module @latest found but does not contain package

釋出自己的go包

建立項目

go mod init "xxx.com/username/packagename"

寫代碼

添加到本地倉庫

git add .

添加注釋

git commit -m ''

添加标簽

git tag -a <版本号> -m "<備注資訊>"

釋出

 git push --tags origin branch

參考

go指令-指令go

更多Go相關内容:Go-Golang學習總結筆記

有問題請下方評論,轉載請注明出處,并附有原文連結,謝謝!如有侵權,請及時聯系。如果您感覺有所收獲,自願打賞,可選擇支付寶18833895206(小于),您的支援是我不斷更新的動力。