【朝花夕拾】Golang之Go Module工程實踐

一、背景

在引入Go Module管理之前,即在Go 版本在1.11之前,項目的框架結(jié)構(gòu)主要是bin、pkg、src,如下的結(jié)構(gòu)應(yīng)該都比較熟悉

~/projectname/
    bin/
    pkg/
    src/
      mypack/        --項目內(nèi)容
        foo.go
        bar.go
        mypack_test.go
      commpack       --三方公共庫
        comunit.go   

正常情況下,如果引入第三方庫,有三種引入方式:

  1. 一般三方庫代碼都是需要放在GOPATH的Src路徑下面,然后直接引入

import (
    "commpack"
)

  1. 通過本地相對路徑引用的方式,如:

import (
    "../commpack"
)

  1. 引用git源碼庫的http路徑

import (
    "github.com/projectname/commpack"
)

二、Go Module項目工程管理

在Go 1.13版本之后,引入了Go Module模式,通過go.mod文件配置,改進了項目框架結(jié)構(gòu)。

下面介紹下如何通過腳本創(chuàng)建項目:

  1. 進入任何路徑,不需要在GOPATH路徑下面,創(chuàng)建項目。

該步驟主要就是生成go.mod文件,也就是通過改文件來對項目、包進行項目工程管理。

# mkdir projectname
# cd projectname
# go mod init projectname   //這里的projectname其實就是module name,可以跟project name不同

注意:
當(dāng)執(zhí)行g(shù)o mod init代碼的時候,就是在項目目錄的根目錄創(chuàng)建一個go.mod文件,里面的首行描述為模塊路徑,后續(xù)import不同模塊的時候,都帶上這個路徑。默認(rèn)跟projectname同名。

go.mod文件內(nèi)容如下,具體每個節(jié)點用戶描述參考結(jié)構(gòu)描述:

module projectname  //此處的projectname,可以為本地項目名,如gateway,或者 源碼項目路徑 github.com/gateway
go 1.14
  1. 新建公共package
# mkdir commpack
# cd commpack
# vi foo.go   //創(chuàng)建go文件

foo.go 文件源碼如下,參考了網(wǎng)上的例子


package commpack

import "fmt"

func Greet(name string) string {

    return fmt.Sprintf("%s,hello", name)
}

  1. 新建main package,demo的項目入口文件
# mkdir mypack
# cd mypack
# vi main.go   

main.go 文件源碼如下


package main

import (
    "fmt"
    "projectname/commpack"   //注意這里導(dǎo)入路徑,projectname是定義在go.mod文件里面
)

func main() {

    fmt.Println(commpack.Greet("liyu"))

}

4.現(xiàn)在回過頭來,整體的項目結(jié)構(gòu)如下,特別注意下,文件名和package名可以不一致。

~/projectname/
    commpack/
      foo.go
      foo_test.go
    mypack       
      main.go   
    go.mod
  1. 執(zhí)行編譯、運行,
# cd projectname/mypack
# go run main.go

附注
# Go.Mod的文件結(jié)構(gòu)描述

module
  
to define the module path; 

go
  
to set the expected language version;

require

to require a particular module at a given version or later;

exclude

to exclude a particular module version from use; and

replace

to replace a module version with a different module version.

# Go Module常用命令

go mod init  # 初始化go.mod
go mod tidy  # 更新依賴文件
go mod download  # 下載依賴文件
go mod vendor  # 將依賴轉(zhuǎn)移至本地的vendor文件
go mod edit  # 手動修改依賴文件
go mod graph  # 打印依賴圖
go mod verify  # 校驗依賴

參考

Go Module 工程化實踐 https://segmentfault.com/a/1190000018398763

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Go Module是Go會在1.12中正式推出的包管理機制。 Go mod 簡介 Golang一直存在一個被人詬病...
    會飛的鯰魚閱讀 47,969評論 1 14
  • 一、Go的包設(shè)計理念 1.代碼盒子 在Go程序中,包是代碼模塊組織的單位,為項目代碼組織結(jié)構(gòu),提高代碼的可讀性、重...
    GoFuncChan閱讀 497評論 0 0
  • 關(guān)于收學(xué)費條獎勵機制:從上學(xué)期開始,收學(xué)費條已經(jīng)不再加班務(wù)分了,為了激勵班級教師積極鼓勵家長年前交托費現(xiàn)在制定本學(xué)...
    素衣凡凡閱讀 310評論 0 0
  • 琴音和鶴舞,雪色共梅香。山外仙橋近,人間耀佛光。 2020年03月21日 《看圖斗詩,好詩送貝》https://w...
    流浪的問號閱讀 751評論 8 33
  • touch是用來修改時間的 cat才是用來查看文件內(nèi)容的,追加內(nèi)容到文件 cat /root/.ssh/id_rs...
    你說你要一場閱讀 870評論 0 0