欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go?mod詳細使用教程

 更新時間:2022年07月28日 15:17:14   作者:若與  
go mod是go的一個模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關于go?mod詳細使用的相關資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

最近由于換工作,開始交接工作。整理以前的工作內容,由于組內就我一個在做go和大數據。 所以開發(fā)沒有規(guī)劃,當時是怎么快怎么來。go也是使用最傳統(tǒng)的go path的方式管理的。都是手動管理依賴的。現在交接給他人,需要多人開發(fā),發(fā)現很多問題。比如版本問題,各種依賴的問題等等。

由于工作原因,幾乎所有主流語言都寫過。所以,對應語言包管理工具也都了解和使用過。我前面有寫過maven的使用。
maven是使用過的功能最強大的包管理工具了,maven定位是項目管理工具。pip和npm都是及格的產品。

我個人覺得,一個包管理工具應該有以下功能:

基本功能

  • 依賴管理
  • 依賴包版本控制
  • 對應的包管理平臺
  • 可以私有化部署

加分:

  • 代碼包是否可以復用
  • 構建,測試,打包
  • 發(fā)布上線

對比上面幾點:

目前做的最好的也就 maven了,gradle沒有使用過,不知道。

今天主角是go mod,先來談談沒有使用go mod之前的問題。

使用go path問題

  • 代碼開發(fā)必須在go path src目錄下,不然,就有問題。
  • 依賴手動管理
  • 依賴包沒有版本可言

從這個看, go path不算包管理工具

govendor

  • 解決了包依賴,一個配置文件就管理
  • 依賴包全都下載到項目vendor下,每個項目都把有一份。拉取項目時,開始懷疑人生。

go mod介紹

go modules 是 golang 1.11 新加的特性。現在1.12 已經發(fā)布了,是時候用起來了。Modules官方定義為:

模塊是相關Go包的集合。modules是源代碼交換和版本控制的單元。 go命令直接支持使用modules,包括記錄和解析對其他模塊的依賴性。modules替換舊的基于GOPATH的方法來指定在給定構建中使用哪些源文件。

如何使用go mod

首先,必須升級go到1.11,目前版本是1.14

下面我以我自己升級演示:

### 卸載舊版本,刪除對應文件
brew uninstall -f go

### 更新一下brew

brew update

### 安裝go
brew install go

上面升級完了,使用 go version看下版本

go version go1.14.1 darwin/amd64

下面設置go mod和go proxy

go env -w GOBIN=/Users/youdi/go/bin
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct // 使用七牛云的

注意: go env -w會將配置寫到 GOENV="/Users/youdi/Library/Application Support/go/env"

下面看下我的配置

GO111MODULE="on"
GOARCH="amd64"
GOBIN="/Users/youdi/go/bin"
GOCACHE="/Users/youdi/Library/Caches/go-build"
GOENV="/Users/youdi/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/youdi/go"
GOPRIVATE=""
GOPROXY="https://goproxy.cn,direct"
GOROOT="/usr/local/go"
GOSUMDB="off"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/8m/v_1j4dgs7rzgqq4p_4_8k_nr0000gn/T/go-build221113671=/tmp/go-build -gno-record-gcc-switches -fno-common"

我們看一下,我修改的內容

cat /Users/youdi/Library/Application Support/go/env

GO111MODULE=on
GOBIN=/Users/youdi/go/bin
GOPROXY=https://goproxy.cn,direct
GOSUMDB=off

GO111MODULE

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文件的目錄下面。

當modules功能啟用時,依賴包的存放位置變更為$GOPATH/pkg,允許同一個package多個版本并存,且多個項目可以共享緩存的 module

我們看下目錄:

cd /Users/youdi/go/pkg

├── darwin_amd64
│   ├── github.com
│   ├── go.etcd.io
│   ├── golang
│   ├── golang.org
│   ├── gopkg.in
│   ├── quickstart
│   └── uc.a
├── mod
│   ├── cache
│   ├── github.com
│   ├── golang.org
│   ├── google.golang.org
│   └── gopkg.in
└── sumdb
    └── sum.golang.org

go mod命令

golang 提供了 go mod命令來管理包。

go help mod

Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.

Usage:

    go mod <command> [arguments]

The commands are:

    download    download modules to local cache
    edit        edit go.mod from tools or scripts
    graph       print module requirement graph
    init        initialize new module in current directory
    tidy        add missing and remove unused modules
    vendor      make vendored copy of dependencies
    verify      verify dependencies have expected content
    why         explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.

go mod 有以下命令:

命令說明
downloaddownload modules to local cache(下載依賴包)
editedit go.mod from tools or scripts(編輯go.mod)
graphprint module requirement graph (打印模塊依賴圖)
verifyinitialize new module in current directory(在當前目錄初始化mod)
tidyadd missing and remove unused modules(拉取缺少的模塊,移除不用的模塊)
vendormake vendored copy of dependencies(將依賴復制到vendor下)
verifyverify dependencies have expected content (驗證依賴是否正確)
whyexplain why packages or modules are needed(解釋為什么需要依賴)

比較常用的是 init,tidy, edit

使用go mod管理一個新項目

1. 初始化項目

可以隨便找一個目錄創(chuàng)建項目,我使用習慣用IDEA進行創(chuàng)建

mkdir Gone
cd Gone
go mod init Gone

查看一下 go.mod文件

module Gone

go 1.14

go.mod文件一旦創(chuàng)建后,它的內容將會被go toolchain全面掌控。go toolchain會在各類命令執(zhí)行時,比如go get、go build、go mod等修改和維護go.mod文件。

go.mod 提供了module, require、replace和exclude 四個命令

  • module 語句指定包的名字(路徑)
  • require 語句指定的依賴項模塊
  • replace 語句可以替換依賴項模塊
  • exclude 語句可以忽略依賴項模塊

2. 添加依賴

創(chuàng)建 main.go文件

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

執(zhí)行 go run main.go 運行代碼會發(fā)現 go mod 會自動查找依賴自動下載

再查看 go.mod

module Gone

go 1.14

require github.com/gin-gonic/gin v1.6.3

go module 安裝 package 的原則是先拉最新的 release tag,若無tag則拉最新的commit

go 會自動生成一個 go.sum 文件來記錄 dependency tree

再次執(zhí)行腳本 go run main.go發(fā)現跳過了檢查并安裝依賴的步驟。

可以使用命令 go list -m -u all 來檢查可以升級的package,使用go get -u need-upgrade-package 升級后會將新的依賴版本更新到go.mod * 也可以使用 go get -u 升級所有依賴

去mod包緩存下看看

/Users/youdi/go/pkg/mod/github.com/gin-gonic/gin@v1.6.3

go get升級

  • 運行 go get -u 將會升級到最新的次要版本或者修訂版本(x.y.z, z是修訂版本號, y是次要版本號)
  • 運行 go get -u=patch 將會升級到最新的修訂版本
  • 運行 go get package@version 將會升級到指定的版本號version
  • 運行go get如果有版本的更改,那么go.mod文件也會更改

使用replace替換無法直接獲取的package

由于某些已知的原因,并不是所有的package都能成功下載,比如:golang.org下的包。

modules 可以通過在 go.mod 文件中使用 replace 指令替換成github上對應的庫,比如:

replace (
    golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
)

go mod發(fā)布和使用

參考Roberto Selbach寫的go mod入門文章,文末,我給出鏈接

Creating a Module

如果你設置好go mod了,那你就可以在任何目錄下隨便創(chuàng)建

$mkdir gomodone
$cd gomodone

在這個目錄下創(chuàng)建一個文件say.go

package gomodone

import "fmt" 

// say Hi to someone
func SayHi(name string) string {
   return fmt.Sprintf("Hi, %s", name)
}

初始化一個 go.mod文件

$ go mod init github.com/jacksonyoudi/gomodone
go: creating new go.mod: module github.com/jacksonyoudi/gomodone

查看 go.mod內容如下:

github.com/jacksonyoudi/gomodone
go 1.14

下面我們要將這個module發(fā)布到github上,然后在另外一個程序使用

$git init
$vim .gitiiignore
$git commit -am "init"
// github創(chuàng)建對應的repo
$git remote add origin git@github.com:jacksonyoudi/gomodone.git
$git push -u origin master

執(zhí)行完,上面我們就相當于發(fā)布完了。

如果有人需要使用,就可以使用

go get github.com/jacksonyoudi/gomodone

這個時候沒有加tag,所以,沒有版本的控制。默認是v0.0.0后面接上時間和commitid。如下:

gomodone@v0.0.0-20200517004046-ee882713fd1e

官方不建議這樣做,沒有進行版本控制管理。

module versioning

使用tag,進行版本控制

making a release

git tag v1.0.0
git push --tags

操作完,我們的module就發(fā)布了一個v1.0.0的版本了。

推薦在這個狀態(tài)下,再切出一個分支,用于后續(xù)v1.0.0的修復推送,不要直接在master分支修復

$git checkout -b v1
$git push -u origin v1

use our module

上面已經發(fā)布了一個v1.0.0的版本,我們可以在另一個項目中使用,創(chuàng)建一個go的項目

$mkdir Gone
$cd Gone
$vim main.go
package main

import (
    "fmt"
    "github.com/jacksonyoudi/gomodone"
)

func main() {
    fmt.Println(gomodone.SayHi("Roberto"))
}

代碼寫好了,我們生成 go mod文件

go mod init Gone

上面命令執(zhí)行完,會生成 go mod文件

看下mod文件:

module Gone

go 1.14

require (
    github.com/jacksonyoudi/gomodone v1.0.0
)
$go mod tidy
go: finding module for package github.com/jacksonyoudi/gomodone
go: found github.com/jacksonyoudi/gomodone in github.com/jacksonyoudi/gomodone v1.0.0

同時還生成了go.sum, 其中包含軟件包的哈希值,以確保我們具有正確的版本和文件。

github.com/jacksonyoudi/gomodone v1.0.1 h1:jFd+qZlAB0R3zqrC9kwO8IgPrAdayMUS0rSHMDc/uG8=
github.com/jacksonyoudi/gomodone v1.0.1/go.mod h1:XWi+BLbuiuC2YM8Qz4yQzTSPtHt3T3hrlNN2pNlyA94=
github.com/jacksonyoudi/gomodone/v2 v2.0.0 h1:GpzGeXCx/Xv2ueiZJ8hEhFwLu7xjxLBjkOYSmg8Ya/w=
github.com/jacksonyoudi/gomodone/v2 v2.0.0/go.mod h1:L8uFPSZNHoAhpaePWUfKmGinjufYdw9c2i70xtBorSw=

這個內容是下面的,需要操作執(zhí)行的結果

go run main.go就可以運行了

Making a bugfix release

假如fix一個bug,我們在v1版本上進行修復

修改代碼如下:

// say Hi to someone
func SayHi(name string) string {
-       return fmt.Sprintf("Hi, %s", name)
+       return fmt.Sprintf("Hi, %s!", name)
}

修復好,我們開始push

$ git commit -m "Emphasize our friendliness" say.go
$ git tag v1.0.1
$ git push --tags origin v1

Updating modules

剛才fix bug,所以要在我們使用項目中更新

這個需要我們手動執(zhí)行更新module操作

我們通過使用我們的好朋友來做到這一點go get:

  • 運行 go get -u 以使用最新的 minor 版本或修補程序版本(即它將從1.0.0更新到例如1.0.1,或者,如果可用,則更新為1.1.0)
  • 運行 go get -u=patch 以使用最新的 修補程序 版本(即,將更新為1.0.1但不更新 為1.1.0)
  • 運行go get package@version 以更新到特定版本(例如github.com/jacksonyoudi/gomodone@v1.0.1

目前module最新的也是v1.0.1

// 更新最新
$go get -u
$go get -u=patch
//指定包,指定版本
$go get github.com/jacksonyoudi/gomodone@v1.0.1

操作完,go.mod文件會修改如下:

module Gone

go 1.14

require (
    github.com/jacksonyoudi/gomodone v1.0.1
)

Major versions

根據語義版本語義,主要版本與次要版本 不同。主要版本可能會破壞向后兼容性。從Go模塊的角度來看,主要版本是 完全不同的軟件包。乍一看這聽起來很奇怪,但這是有道理的:兩個不兼容的庫版本是兩個不同的庫。

比如下面修改,完全破壞了兼容性。

package gomodone

import (
    "errors"
    "fmt"
)

// Hi returns a friendly greeting
// Hi returns a friendly greeting in language lang
func SayHi(name, lang string) (string, error) {
    switch lang {
    case "en":
        return fmt.Sprintf("Hi, %s!", name), nil
    case "pt":
        return fmt.Sprintf("Oi, %s!", name), nil
    case "es":
        return fmt.Sprintf("?Hola, %s!", name), nil
    case "fr":
        return fmt.Sprintf("Bonjour, %s!", name), nil
    default:
        return "", errors.New("unknown language")
    }
}

如上,我們需要不同的大版本,這種情況下

修改 go.mod如下

module github.com/jacksonyoudi/gomodone/v2

go 1.14

然后,重新tag,push

$ git commit say.go -m "Change Hi to allow multilang"
$ git checkout -b v2 # 用于v2版本,后續(xù)修復v2
$ git commit go.mod -m "Bump version to v2"
$ git tag v2.0.0
$ git push --tags origin v2 

Updating to a major version

即使發(fā)布了庫的新不兼容版本,現有軟件 也不會中斷,因為它將繼續(xù)使用現有版本1.0.1。go get -u 將不會獲得版本2.0.0。

如果想使用v2.0.0,代碼改成如下:

package main

import (
    "fmt"
    "github.com/jacksonyoudi/gomodone/v2"
)

func main() {
    g, err := gomodone.SayHi("Roberto", "pt")
    if err != nil {
        panic(err)
    }
    fmt.Println(g)
}

執(zhí)行 go mod tidy

go: finding module for package github.com/jacksonyoudi/gomodone/v2
go: downloading github.com/jacksonyoudi/gomodone/v2 v2.0.0
go: found github.com/jacksonyoudi/gomodone/v2 in github.com/jacksonyoudi/gomodone/v2 v2.0.0

當然,兩個版本都可以同時使用, 使用別名

如下:

package main

import (
    "fmt"
    "github.com/jacksonyoudi/gomodone"
    mv2 "github.com/jacksonyoudi/gomodone/v2"
)

func main() {
    g, err := mv2.SayHi("Roberto", "pt")
    if err != nil {
        panic(err)
    }
    fmt.Println(g)

    fmt.Println(gomodone.SayHi("Roberto"))
}

執(zhí)行一下 go mod tidy

Vendoring

默認是忽略vendor的,如果想在項目目錄下有vendor可以執(zhí)行下面命令

$go vendor

當然,如果構建程序的時候,希望使用vendor中的依賴,

$ go build -mod vendor

IDEA下開發(fā)GO

  • 創(chuàng)建go項目

  • 創(chuàng)建完項目,會自動生成go mod文件
    如果需要修改,可以手動修改,加入git等操作

  • 寫業(yè)務邏輯代碼

  • 解決依賴,更新go.mod

  • go build

總結

到此這篇關于go mod詳細使用教程的文章就介紹到這了,更多相關go mod使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang中的自定義類型之間的轉換的實現(type conversion)

    Golang中的自定義類型之間的轉換的實現(type conversion)

    這篇文章主要介紹了Golang中的自定義類型之間的轉換的實現(type conversion),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Go語言使用templ實現編寫HTML用戶界面

    Go語言使用templ實現編寫HTML用戶界面

    templ是一個在 Go 中編寫 HTML 用戶界面的語言,使用 templ,我們可以創(chuàng)建可呈現 HTML 片段的組件,下面就跟隨小編一起了解一下具體的實現方法吧
    2023-12-12
  • golang中字符串MD5生成方式總結

    golang中字符串MD5生成方式總結

    在本篇文章里小編給大家整理的是一篇關于golang中字符串MD5生成方式總結內容,有興趣的朋友們可以跟著學習參考下。
    2021-07-07
  • GoLang讀取文件的10種方法實例

    GoLang讀取文件的10種方法實例

    讀取文件是所有編程語言中最常見的操作之一,下面這篇文章主要給大家介紹了關于GoLang讀取文件的10種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 一百行Golang代碼實現簡單并發(fā)聊天室

    一百行Golang代碼實現簡單并發(fā)聊天室

    這篇文章主要為大家詳細介紹了一百行Golang代碼如何實現簡單并發(fā)聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • golang slice元素去重操作

    golang slice元素去重操作

    這篇文章主要介紹了golang slice元素去重操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言中slice作為參數傳遞時遇到的一些“坑”

    Go語言中slice作為參數傳遞時遇到的一些“坑”

    這篇文章主要給大家介紹了關于Go語言中slice作為參數傳遞時遇到的一些“坑”,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • 一文帶你了解Go語言中time包的時間常用操作

    一文帶你了解Go語言中time包的時間常用操作

    在日常開發(fā)中,我們避免不了時間的使用,我們可能需要獲取當前時間,然后格式化保存,也可能需要在時間類型與字符串類型之間相互轉換等。本文將會對?Go?time?包里面的常用函數和方法進行介紹,需要的可以參考一下
    2022-12-12
  • Go?1.21.0?新增結構化日志記錄標準庫log/slog使用詳解

    Go?1.21.0?新增結構化日志記錄標準庫log/slog使用詳解

    這篇文章主要為大家介紹了Go?1.21.0?新增結構化日志記錄標準庫log/slog使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 詳解golang執(zhí)行Linux shell命令完整場景下的使用方法

    詳解golang執(zhí)行Linux shell命令完整場景下的使用方法

    本文主要介紹了golang執(zhí)行Linux shell命令完整場景下的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06

最新評論