goland終端如何導入github上的包



例如:我們要導入gin包,最開始我直接輸入go get -u github.com/gin-gonic/gin
會出現以下的問題:

確保下載git
# cd F:\goworkspace\src\github.com\gin-gonic\gin; git pull --ff-only
fatal: not a git repository (or any of the parent directories): .git
package github.com/gin-gonic/gin: exit status 128
然后我在終端輸入go env -w GO111MODULE=on
還是無法導入gin包,出現了下面的問題:
go get github.com/gin-gonic/gin: module github.com/gin-gonic/gin: Get “https://proxy.golang.org/github.com/gin-gonic/gin/@v/list”: dial tcp 34.64.4.81:443: connectex: A connection atte
mpt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

之后我又輸入:go env -w GOPROXY=https://goproxy.cn,direct
然后在輸入go get -u github.com/gin-gonic/gin,導入成功!!!

目錄
基本使用
環境准備
初始化go module環境
下載依賴包
添加新依賴包
將依賴包下載到vendor目錄
亮點功能一:使用replace本地包替換
亮點功能二:語意化版本 semver---Semantic Versioning
亮點功能三:依賴包沖突問題
情況1:直接 引用的包 和 間接引用的包是同一個包,但版本不同時?
情況2: 間接引用的兩個包是同一個包,但版本不同時?
亮點功能四:自動查找包依賴
總結:

前兩天參加了 GopherChina 的大會收獲頗多,go module算一個,下面把總結使用分享給大家,有問題希望指正。
基本使用
環境准備
golang 1.11的朋友,開啟 GO11MODULE=on ,並且確保實驗目錄不在 GOPATH 中,命令行里執行。
export GO11MODULE=on
export GO111MODULE=on
golang 1.12的朋友,確保實驗目錄不在 GOPATH 中。
加速下載,命令行里執行。
export GOPROXY=https://goproxy.io
初始化go module環境
帶git的項目

直接從github上面clone一個項目下來。
直接執行 go mod init 會自動生成帶git地址的packagename
➜ gomodtest_base git:(master) ✗ go mod init
go: creating new go.mod: module github.com/e421083458/gomodtest_base

不帶git的項目

直接執行
go mod init packagename

下載依賴包
只下載依賴包

go mod download
➜ new_module_test go mod download
go: finding github.com/e421083458/gomodtest_dep v0.0.0-20190501153957-6ff7f41fdb83
go: finding github.com/e421083458/gomodtest_base v1.0.1
go: finding github.com/e421083458/gomodtest_base/v2 v2.0.0
go: finding github.com/jianfengye/collection v0.0.0-20190426092112-28c4a03f0c86
go: finding github.com/pkg/errors v0.8.1

拉取必須模塊,移除不用的模塊

go mod tidy

注意點:

如果tag對應內容有更新,需要刪除pkg中的緩存內容。這點比較惡心了。
cd $GOPATH/pkg/mod
rm -rf *

go get、 go run、go build 也會自動下載依賴
添加新依賴包
方法一:
直接修改 go.mod 文件,然后執行 go mod download
方法二:
使用 go get packagename@v1.2.3,會自動更新 go.mod 文件的
方法三:
go run、go build 也會自動下載依賴

將依賴包下載到vendor目錄
go mod vendor

注意: 這里只會下載對應版本的包文件,不會把所有版本下載。跟之前1.11使用方式一致。

亮點功能一:使用replace本地包替換
有時候國外軟件可能被牆,這個功能就能派上用場了。
main.go

main.go

package main
import "my/example/pkg"
func main() {
pkg.Hello()
}

go.mod

module my-mod

require my/example/pkg v0.0.0
replace my/example/pkg => ./pkg

replace 可以文件夾,也可以是另外一個package

module my-mod

require my/example/pkg v0.0.0
replace my/example/pkg v0.0.0 => github.com/example/pkg v0.0.0

注意點: 頂層依賴可替換但間接依賴不可替換

亮點功能二:語意化版本 semver—Semantic Versioning
semver是官方為了類庫升級引入的新規范,即:
“If an old package and a new package have the same import path, the new package must be backwards compatible with the old package.” - go modules wiki "
如果舊軟件包和新軟件包具有相同的導入路徑,則新軟件包必須向后兼容舊軟件包。"

main.go

package main
import (
"fmt"
v1 "github.com/e421083458/gomodtest_base"
v2 "github.com/e421083458/gomodtest_base/v2"
)
func main(){
v2.NewIntCollection("hello","sex")
v1.NewIntCollection("hello")
fmt.Println("hello");

go.mod

module new_module_test

require (
github.com/e421083458/gomodtest_base v1.0.1
github.com/e421083458/gomodtest_base/v2 v2.0.0
)
亮點功能三:依賴包沖突問題
情況1:直接 引用的包 和 間接引用的包是同一個包,但版本不同時?
依賴關系:
gomodtest_test|--> gomodtest_dep |--> gomodtest_base@v1.0.0
|--> gomodtest_base@v1.0.1
go mod tidy 時,gomodtest_test會自動更新到與依賴包關聯的第三方包相同版本號,並寫入到go.mod,從而解決了版本沖突問題。

情況2: 間接引用的兩個包是同一個包,但版本不同時?
比如以下場景:
gomodtest_test|--> gomodtest_dep |--> gomodtest_base@v1.0.0
|--> gomodtest_dep2 |--> gomodtest_base@v1.0.1
go mod tidy 時,默認使用第一個包引用版本號,gomodtest_base@v1.0.1,並寫入到go.mod,這個時候就要注意兩個版本是否功能完全兼容的問題了。

亮點功能四:自動查找包依賴
go mod 遵循了之前go get 自動下載依賴特性。所有的依賴包會自動全部下載。
未啟用 go mod 功能的包會自動下載最高 tag 版本或最高 master commit版本
我之前也以為go mod只會自動查詢使用了go mod的功能的包。

➜ new_module_test go mod download
go: finding github.com/e421083458/gomodtest_dep v0.0.0-20190501153957-6ff7f41fdb83
go: finding github.com/e421083458/gomodtest_base v1.0.1
go: finding github.com/e421083458/gomodtest_base/v2 v2.0.0
go: finding github.com/jianfengye/collection v0.0.0-20190426092112-28c4a03f0c86
go: finding github.com/pkg/errors v0.8.1
總結:
大部分場景下 go mod init 和 go mod tidy 兩個命令就夠用了
查看$GOPATH/pkg/mod里面的文件就知道了,mod做了一件類似maven的事把所有包都打上了版本號。
可以說這是 golang 邁向高大上語言的標志。
從此我們不再為多版本使用的困擾,也不再為IDE打開一個新項目后等待n分鍾的生成緩存犯愁。推薦大家丟掉vendor使用統一管理。
semver 將版本信息綁定進包名對於習慣了傳統包管理器方案的用戶來說顯得有些怪異,可能需要花上一些額外時間適應。
————————————————
版權聲明:本文為CSDN博主「e421083458」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/e421083458/article/details/89762113


————————————————
版權聲明:本文為CSDN博主「catboygg-」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_44033530/article/details/108421044


免責聲明!

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



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