GO問答之爲何項目要在 GOPATH/src 目錄下

問題

beego的bee工具爲何強制新建項目在GOPATH/src目錄下?git

每次升級bee工具都要先改其源碼使之能夠在任意目錄內生成項目。實在不喜歡把第三方庫和本身的全部項目放在一個目錄下,太亂了。順便問一下go爲何建議把全部項目源碼都放在gopath/src目錄內?github

回答

爲何?golang

由於 GO 的包搜索是從 GOPATH 和 GOROOT 路徑下搜索,源碼必需要放在 GOROOT 或 GOPATH 的 src 目錄下才能找到。但把源碼和包放在一塊兒,對於不少人來講確實不太很習慣,有一種作法,經過在 GOPATH 中設置兩個路徑,go get 下載的包默認放在 GOPATH 設置的第一個路徑下。好比,GOPATH 設置以下:bash

export GOPATH=/Users/polo/go/:/Users/polo/Work/go
複製代碼

如此就能夠把工做區設在 /Users/polo/Work/go/src,而安裝包放在 /Users/polo/go/src。網絡

其實我以爲,直接放在一塊兒也挺好的,看源碼的時候還方便點。工具

除此以外,GO 其實也提供了一些包依賴管理工具,但都並不是 GO 自帶。簡單舉幾個例子,以下:ui

  • dep
  • vgo
  • godep

等等。google

我在網上找了一篇2017年的文章,描述了 GO 包管理工具的一些歷史和當時的狀況,Go包管理的前世此生 - InfoQspa

如今2019年了,GO 1.11 以後,已經內置了 go mod 實現包管理。下面來簡單體驗下它的用法。翻譯

在任意目錄下新建 main.go 文件,沒必要是 GOPATH 指定的目錄:

package main

import (
	"fmt"
	"log"

	"github.com/levigross/grequests"
)

func main() {

	resp, err := grequests.Get("http://httpbin.org/get", nil)
	// You can modify the request by passing an optional RequestOptions struct

	if err != nil {
		log.Fatalln("Unable to make request: ", err)
	}

	fmt.Println(resp.String())
}
複製代碼

其中用到了一個方便發送 HTTP 請求的第三方包 grequest,經過它發出 GET 請求來訪問http://httpbin.org/get。

執行以下命令初始化 httpreq 模塊

$ go mod init httpreq
複製代碼

若是沒有網絡問題,接下來直接執行 go build 就能夠編譯成功了。

但這裏依賴了不少 go 的系統包,須要從 golang.org下載,go build 會失敗。可使用 go mod 的replace功能,用 github 替換 golang org,實現從 github下載。replace 的具體使用先不介紹了。

直接貼一份可用的 go.mod 文件,內容以下:

module httpreq

require (
	github.com/google/go-querystring v1.0.0 // indirect
	github.com/levigross/grequests v0.0.0-20190130132859-37c80f76a0da
	golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
	golang.org/x/net v0.0.0-20190522155817-f3200d17e092
	golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a
	golang.org/x/text v0.3.0
)

replace golang.org/x/net v0.0.0-20190522155817-f3200d17e092 => github.com/golang/net v0.0.0-20190522155817-f3200d17e092

replace golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 => github.com/golang/crypto v0.0.0-20190308221718-c2843e01d9a2

replace golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0

replace golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a => github.com/golang/sys v0.0.0-20190215142949-d0b11bdaac8a
複製代碼

替換掉你的 go.mod 的文件,直接執行 go build 即可以編譯成功,目錄下回生成一個可執行文件 httpreq。

關於 go mod 推薦幾篇文章。地址以下:

官方wiki文檔,最近更新十幾天前,

go module 的 step by step ,國外某大仙寫了一篇由淺入深的文章。 翻譯,在國內的 studygolang 已經有了。

這位大仙后來又寫了一篇介紹 GOPROXY 的文章。

相關文章
相關標籤/搜索