天天看點

Go實戰之常用指令行工具(中)2 構模組化式

編譯安裝包和依賴項

也是編譯,與build最大的差別是編譯後會将輸出檔案打包成庫放在pkg下

install     compile and install packages and dependencies
go install [-i] [build flags] [packages]      

可執行檔案安裝在由GOBIN環境變量命名的目錄中,如果未設定GOPATH環境變量,則預設為[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-9JI2pY2J-1605846310736)(https://static.studygolang.com/191006/b46ed6e425e622ef35f3996ab983ba8d)]HOME/go/bin; [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-9YSEUri9-1605846310739)(https://static.studygolang.com/191006/51c9c2363e64aa6a344033bacaebae24)]GOROOT/bin或[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-Ys8tIYlG-1605846310740)(https://static.studygolang.com/191006/7a85f308b8441edf74327ac6772316fa)]GOBIN中

禁用module-aware模式時,其他軟體包将安裝在目錄[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-0oJ2heSZ-1605846310741)(https://static.studygolang.com/191006/39934a7eaf8a988547a51602765b9fad)]GOOS_$GOARCH中; 啟用module-aware模式時,将建構并緩存其他包,但不安裝。-i标志還安裝命名包的依賴項

列出包或子產品 使用方法

go list [-f format] [-json] [-m] [list flags] [build flags] [packages]      

list列出了命名包,每行一個。最常用的标志是-f和-json,它們控制為每個包列印的輸出的形式。-f标志

使用包模闆的文法指定清單的備用格式,傳遞給模闆的結構形如

type Package struct {
        Dir           string   // 包含包源代碼的目錄
        ImportPath    string   // 包在目錄中的導入路徑
        ImportComment string   // package語句的import注釋中的路徑
        Name          string   // 包名稱
        Doc           string   // 封包檔字元串
        Target        string   // 安裝路徑
        Shlib         string   // 包含此包的共享庫(僅在-linkshared時設定)
        Goroot        bool     // 這個包在GOROOT目錄下嗎?
        Standard      bool     // 這個包是标準go庫的一部分嗎?
        Stale         bool     // `go install`對這個包有什麼作用碼?
        StaleReason   string   // explanation for Stale==true
        Root          string   // 包含這個包的GOROOT或GOPATH目錄
        ConflictDir   string   // $GOPATH中的這個目錄shadows dir
        BinaryOnly    bool     // binary-only package (no longer supported)
        ForTest       string   // package is only for use in named test
        Export        string   // file containing export data (when using -export)
        Module        *Module  // info about package's containing module, if any (can be nil)
        Match         []string // command-line patterns matching this package
        DepOnly       bool     // package is only a dependency, not explicitly listed

        // Source files
        GoFiles         []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
        CgoFiles        []string // .go source files that import "C"
        CompiledGoFiles []string // .go files presented to compiler (when using -compiled)
        IgnoredGoFiles  []string // .go source files ignored due to build constraints
        CFiles          []string // .c source files
        CXXFiles        []string // .cc, .cxx and .cpp source files
        MFiles          []string // .m source files
        HFiles          []string // .h, .hh, .hpp and .hxx source files
        FFiles          []string // .f, .F, .for and .f90 Fortran source files
        SFiles          []string // .s source files
        SwigFiles       []string // .swig files
        SwigCXXFiles    []string // .swigcxx files
        SysoFiles       []string // .syso object files to add to archive
        TestGoFiles     []string // _test.go files in package
        XTestGoFiles    []string // _test.go files outside package

        // Cgo directives
        CgoCFLAGS    []string // cgo: flags for C compiler
        CgoCPPFLAGS  []string // cgo: flags for C preprocessor
        CgoCXXFLAGS  []string // cgo: flags for C++ compiler
        CgoFFLAGS    []string // cgo: flags for Fortran compiler
        CgoLDFLAGS   []string // cgo: flags for linker
        CgoPkgConfig []string // cgo: pkg-config names

        // Dependency information
        Imports      []string          // import paths used by this package
        ImportMap    map[string]string // map from source import to ImportPath (identity entries omitted)
        Deps         []string          // all (recursively) imported dependencies
        TestImports  []string          // imports from TestGoFiles
        XTestImports []string          // imports from XTestGoFiles

        // Error information
        Incomplete bool            // this package or a dependency has an error
        Error      *PackageError   // error loading package
        DepsErrors []*PackageError // errors loading dependencies
}      

下面記錄的其他清單标志控制更具體的細節

Go實戰之常用指令行工具(中)2 構模組化式

go list

子產品維護 go mod提供對子產品操作的通路,使用方法如下所示

go mod <command> [arguments]      

注意,所有go指令都内置了對子產品的支援,而不僅僅是“go mod”。例如,日常添加、删除、更新和降級依賴項都應該使用“go get”完成。command清單如下

Go實戰之常用指令行工具(中)2 構模組化式

go mod

下載下傳子產品到本地緩存 使用方法如下

go mod download [-json] [modules]      

下載下傳命名子產品,可以是選擇主子產品依賴項的子產品模式,也可以是path@version格式的子產品查詢。如果沒有參數,download将應用于主子產品的所有依賴項

go指令将在正常執行期間根據需要自動下載下傳子產品。“go mod download”指令主要用于預填充本地緩存或計算go子產品代理

從工具或腳本編輯go.mod 使用方法如下

go mod edit [editing flags] [go.mod]      

編輯提供了一個用于編輯go.mod的指令行接口,主要用于工具或腳本。它隻讀取go.mod,不查找有關子產品的資訊。預設情況下,edit讀取和寫入主子產品的go.mod檔案,但可以在編輯标志後指定其他目标檔案。編輯标志指定一些列編輯操作

Go實戰之常用指令行工具(中)2 構模組化式

go mod edit

列印子產品需求圖 使用方法如下

go mod graph      

圖以文本形式列印子產品需求圖(應用的替換)。輸出中的每一行都有兩個空格分隔的字段:一個子產品及其一個需求。每個子產品都被辨別為path@version格式的字元串,但主子產品沒有@version字尾

在目前目錄下初始化新的子產品 使用方法

go mod init [module]      

init初始化并将新go.mod寫入目前目錄,實際上建立一個新的子產品,該子產品以目前目錄為根

添加缺失的子產品并移除未使用的子產品 使用方法如下

go mod tidy [-v]      

tidy確定go.mod與子產品中的源代碼比對。它增加了建構目前子產品的包和依賴項所需的任何缺少的子產品,并且移除未使用的子產品。它還将添加任何缺少項的go.sum并删除任何不必要的項

-v标志導緻tidy将有關已删除子產品的資訊列印到标準錯誤

生成依賴項的自動生成副本 使用說明

go mod vendor [-v]      

vendor重置主子產品的vendor目錄,以包含建構和測試所有主子產品包所需的所有包。它不包括vendored的測試代碼

-v标志将vendor提供的子產品和包的名稱列印為标準錯誤

驗證依賴項是否具有預期内容 使用說明

go mod verify      

驗證檢查目前子產品(存儲在本地下載下傳的源緩存中)的依賴項在下載下傳後是否未被修改。如果所有子產品都未修改,驗證列印“all modules verified.”,否則它報告哪些子產品已被更改,并導緻“go mod”以非零狀态退出

解釋為什麼需要包或子產品 使用說明

go mod why [-m] [-vendor] packages...      

why在導入圖中顯示從主子產品到列出的每個包的最短路徑。如果給定了-m标志,why将參數視為子產品清單,并在每個子產品中找到指向任何包的路徑。預設情況下,why查詢與“go list all”比對的包的graph,其中包括可通路包的測試。-vendor标志導緻排除依賴項測試的原因

編譯并運作go程式 使用說明

go run [build flags] [-exec xprog] package [arguments...]      

run編譯并運作名為main的go包。通常,包被指定為來自單個目錄的.go源檔案清單,但它也可能是與單個已知包比對的導入路徑、檔案系統路徑或模式,如“go run.”或“go run my/cmd”

預設情況下,“go run”直接運作編譯後的二進制檔案:“a.out arguments…”。如果給定了-exec标志,“go run”使用xprog調用二進制檔案xprog a.out arguments...

測試包

運作目前包目錄下的tests

常用指令如:

go test

go test -v

test packages
go test [build/test flags] [packages] [build/test flags & test binary flags]      

go test重新編譯每個包以及名稱與檔案模式*_test.go比對的任何檔案。這些附加檔案可以包含test functions、benchmark functions和example functions。每個列出的包都會導緻執行單獨的測試二進制檔案。檔案名以_開頭的檔案(包括_test.go)或.被忽略

Go的test一般以xxx_ test.go為檔案名

xxx的部分一般為xxx _test.go所要測試的代碼檔案名。

Go并未強制xxx的部分必須是要測試的檔案名,隻是最佳實踐。

用字尾_test聲明包的測試檔案将被編譯為單獨的包,然後與主測試二進制連接配接并運作。go工具将會忽略名為testdata的目錄,使其可以儲存測試所需的輔助資料

go test的兩種不同運作模式

本地目錄模式,在沒有包參數(例如,“go test”或“go test-v”)的情況下調用go test時發生。在此模式下,go test編譯目前目錄中包的源碼和測試檔案,然後運作生成的測試二進制檔案。在此模式下,将禁用緩存。在包測試完成後,go測試列印一個顯示測試狀态的“摘要行”(“OK”或“FAIL”)、包名和測試的時間

包清單模式,在使用顯式包參數(例如“go test math”、“go test ./…”、“go test”)調用go test時發生。在此模式下,go test編譯并測試指令行中列出的每個包。如果包測試通過,則go測試隻列印最終的“OK”摘要行。如果包測試失敗,go test将列印完整的測試輸出。如果使用-bench或-v标志調用,go測試列印完整的輸出,甚至通過傳遞包測試,以便顯示請求的基準測試結果或冗長日志記錄。所有列出的包測試完成并列印輸出後,如果存在任何一個包測試失敗,go test将列印最終“FAIL”狀态

僅在包清單模式下,go test緩存成功的包測試結果,以避免不必要的重複運作測試。當測試結果可以從緩存中恢複時,go test将重新顯示以前的輸出,而不是再次運作測試二進制檔案。當發生這種情況時,go測試列印(緩存)代替彙總行中測試花費的時間

Go實戰之常用指令行工具(中)2 構模組化式

test檔案下的每一個test case須以Test開頭并且符合TestXxx形式,否則go test會直接跳過測試不執行

test case的入參為t *testing.T或b *testing.B

t.Errorf為列印錯誤資訊,并且目前test case會被跳過

Go的test不會保證多個TestXxx是順序執行,但是通常會按順序執行。推薦使用 subTest

Go實戰之常用指令行工具(中)2 構模組化式

使用t.Run來執行subtests可以做到控制test輸出以及test的順序

TestMain 入口 testcase

使用TestMain作為初始化test,并且使用m.Run()來調用其他tests可

以完成一些需 要初始化操作的testing,比如資料庫連接配接,檔案打開,

REST服務登入等

如果沒有在TestMain中調用m.Run()則除了TestMain以外的其他tests

都不會被執行

Go實戰之常用指令行工具(中)2 構模組化式

Test 之benchmark

  • benchmark函數一般以Benchmark開頭
  • benchmark的case一般會跑b.N次,而且每次執行都會如此
  • 在執行過程中會根據實際case的執行時間是否穩定會增加b.N的次數

    以達到穩态

運作特定的go工具

go tool [-n] command [args...]      

tool運作由參數辨別的go tool指令,-n标志不帶參數地列印已知工具的清單

go版本資訊 使用說明

go version [-m] [-v] [file ...]      

go version報告用于建構每個可執行檔案的go版本。如果指令行中沒有命名檔案,則go version将列印其自己的版本資訊; 如果目錄被命名,go version将周遊該目錄,遞歸地查找識别的go二進制檔案并報告它們的版本。預設情況下,go version不會報告在目錄掃描期間發現的無法識别的檔案

-v标志 報告無法識别的檔案

-m标志 go version在可用時列印每個可執行檔案的嵌入子產品版本資訊。在輸出中,子產品資訊由版本行後面的多行組成,每行由一個前導制表符縮進

報告包中可能出現的錯誤 使用方法說明

go vet [-n] [-x] [-vettool prog] [build flags] [vet flags] [packages]      

vet對由導入路徑命名的包運作go vet指令

2 構模組化式

====

go build

go install

指令采用-buildmode參數,該參數訓示要生成哪種類型的對象檔案。目前支援的值為

Go實戰之常用指令行工具(中)2 構模組化式

build modes