go - 使用 gomod 管理項目依賴

go 1.11.1開始可使用更優雅靈活的module機制作包依賴管理,能直接感覺到的優勢以下:git

  1. 項目路徑能夠脫離$GOPATH了,不須要必須放在$GOPATH/src下。
  2. 項目內部模塊的引入是基於moduleName而再也不死板的基於projectName了。
  3. 半自動維護依賴,若是你很懶,你甚至能夠不須要使用get預先安裝依賴,modulerun test build時會檢測未下載的依賴,並自動下載它們。

回想之前吧!$GOPATH/src/projectName後,項目中各模塊互相引用的話都是基於projectName(go 的包加載機制致使的,去 $GOROOT/src$GOPATH/src 去尋址,因此projectName也須要做爲包引入路徑的一部分),別人使用你的項目時也必須是projectName,不然就得把項目內的全部projectName改成他們的項目名,不優雅極了。github

module模式下,項目的包域是moduleName,和projectName無關,項目名稱怎樣都好,moduleName會註冊到加載路徑中去。bash

雖然 module能夠靈活到消除 項目名做爲項目模塊引入路徑的槽點,但若是後面要轉爲普通的 vendor模式的話,咱們仍是建議 moduleNameprojetName保持一致。

init

初始化項目爲module模式:go mod init moduleNameapp

# 不須要必須在 $GOPATH/src 下
mkdir go_mod_proj && cd go_mod_proj
go mod init app
# go: creating new go.mod: module app
# 會生成一個 go.mod 文件 查看內容以下
vi go.mod

module app

go 1.12
# module app 即定義了當前項目的包域
# 往常咱們要引入 go_mod_proj 下的 test 包須要
# import "go_mod_proj/test"
# module 模式下則是 優雅的很 像 PHP 的命名空間映射同樣靈活
# import "app/test"

示例ui

tree .
.
├── go.mod
├── main.go
└── utils
    └── msg.go
# go.mod
module app

go 1.12
# utils/msg.go
package utils

func Hello() {
    println("hello go")
}
# main.go
package main

import (
    "app/utils" // 注意項目模塊包的引入是以 moduleName 做爲包域的
)

func main() {
    utils.Hello()
}

# go run main.go

自動維護

咱們平常開發時須要某依賴包的話,都會使用 go get下載後再運行,module模式下由於會自動的解析項目依賴,會自動的去下載那些未在本地的依賴包,刪除那些再也不須要的依賴包。code

tidy

tidy主要用來手動維護項目的包依賴,會檢測項目當前的依賴,作相應的記錄或移除。開發

# 好比引入一個依賴包
package main

import (
    "app/utils"
    "github.com/sqrtcat/hello"
)

func main() {
    utils.Hello()
    hello.Hello()
}
# 運行一下
go mod tidy
# 查看 go.mod
module app

go 1.12

require github.com/sqrtcat/hello v0.0.0-20190617081741-06081a1a8fc1
# 刪掉 main.go 中 hello 包的引入後再執行
# main.go
package main

import (
    "app/utils"
)

func main() {
    utils.Hello()
}
# 運行一下
go mod tidy
# 查看 go.mod
module app

go 1.12

edit

不經常使用,忽略get

vendor

module項目轉爲普通的vendor項目,這時就須要將項目移至$GOPATH/src下,並要保證projectNamemoduleName保持一致,不然要手動去修改項目模塊包的加載路徑了。it

相關文章
相關標籤/搜索