溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go36-1-命令行工具

發(fā)布時(shí)間:2020-05-06 07:32:57 來(lái)源:網(wǎng)絡(luò) 閱讀:1120 作者:騎士救兵 欄目:編程語(yǔ)言

源碼安裝工具 go install

源碼文件通常會(huì)被放在某個(gè)工作區(qū)的 src 子目錄下。
那么在安裝后如果產(chǎn)生了歸檔文件,就會(huì)放進(jìn)該工作區(qū)的 pkg 子目錄;如果產(chǎn)生了可執(zhí)行文件,就可能會(huì)放進(jìn)該工作區(qū)的 bin 子目錄。

歸檔文件存放的位置

安裝某個(gè)代碼包而產(chǎn)生的歸檔文件是與這個(gè)代碼包同名的,擴(kuò)展名是 .a。放置它的相對(duì)目錄就是代碼包的導(dǎo)入的父級(jí)文件夾的路徑。
執(zhí)行命令:

go install github.com/labstack/echo

生成的歸檔文件的相對(duì)目錄就是 github.com/labstack , 文件名為 echo.a。
上面的相對(duì)路徑是在pkg目錄下的,并且中間還有一層目錄,目錄的名稱是操作系統(tǒng)有關(guān)的,叫做平臺(tái)相關(guān)目錄。目錄名稱是操作系統(tǒng)、下劃線和計(jì)算架構(gòu)的代號(hào)組成。比如:linux_amd64、windows_amd64。
因此上面的代碼存放的相對(duì)路徑是:pkg/windows_amd64/github.com/labstack/echo.a
上述內(nèi)容也可以去Go安裝的路徑下查看,比如我的Win10系統(tǒng),把Go安裝在了D盤的根目錄下。于是在 D:\Go\pkg\windows_amd64 目錄下就可以看到所有標(biāo)準(zhǔn)庫(kù)的歸檔文件。

構(gòu)建 go build 和安裝 go install

構(gòu)建使用命令go build,安裝使用命令go install。構(gòu)建和安裝代碼包的時(shí)候都會(huì)執(zhí)行編譯、打包等操作,并且這些操作生成的任何文件都會(huì)先被保存到某個(gè)臨時(shí)的目錄中。
源碼文件分為三種,它們都有著不同的用途和編寫規(guī)則:

  • 命令源碼文件,聲明屬于main包并且包含一個(gè)main主函數(shù)(應(yīng)該還是個(gè)無(wú)參數(shù)無(wú)返回值的函數(shù)),所以可以被直接執(zhí)行
  • 庫(kù)源碼文件,不含主函數(shù)的包文件,不能被直接運(yùn)行,它僅用于存放程序?qū)嶓w。
  • 測(cè)試源碼文件,名稱以_test.go結(jié)尾的源文件。不是下面要講的,略過(guò)。

構(gòu)建 go build

如果構(gòu)建的是庫(kù)源碼文件,那么操作的結(jié)果文件只會(huì)存在于臨時(shí)目錄中。這里的構(gòu)建的主要意義在于檢查和驗(yàn)證。
也就是構(gòu)建了臨時(shí)目錄,然后就丟棄了。如果有問(wèn)題就會(huì)報(bào)出來(lái),如果沒(méi)問(wèn)題就相當(dāng)于一頓操作后什么都沒(méi)變化,就是上面說(shuō)的加和驗(yàn)證。
如果構(gòu)建的是命令源碼文件,那么操作的結(jié)果文件會(huì)被搬運(yùn)到那個(gè)源碼文件所在的目錄中。
一般構(gòu)建就是用來(lái)做這個(gè)事情的。

安裝 go install

安裝操作會(huì)先執(zhí)行構(gòu)建,然后還會(huì)進(jìn)行鏈接操作,并且把結(jié)果文件搬運(yùn)到指定目錄。
如果安裝的是庫(kù)源碼文件,那么結(jié)果文件會(huì)被搬運(yùn)到它所在工作區(qū)的 pkg 目錄下的某個(gè)子目錄中。
如果安裝的是命令源碼文件,那么結(jié)果文件會(huì)被搬運(yùn)到它所在工作區(qū)的 bin 目錄中,或者環(huán)境變量GOBIN指向的目錄中。

小結(jié)

命令源碼文件,通過(guò)構(gòu)建或安裝都可以完成編譯,只是生成的可執(zhí)行文件的目錄不同。一般就用構(gòu)建了,可以帶參數(shù)指定位置。
庫(kù)源碼文件,只有通過(guò)安裝才能在pkg中生成包文件。
一般就是構(gòu)建源碼文件。庫(kù)文件的話就是進(jìn)行安裝。

go build 命令

在運(yùn)行g(shù)o build命令的時(shí)候,默認(rèn)不會(huì)編譯目標(biāo)代碼包所依賴的那些代碼包,如果歸檔文件已經(jīng)存在的話。如果被依賴的代碼包的歸檔文件不存在,或者源碼文件有了變化,那它還是會(huì)被編譯。常用參數(shù)說(shuō)明:

  • -a : 可以強(qiáng)制編譯依賴的代碼包
  • -i : 不但要編譯依賴的代碼包,還要安裝它們的歸檔文件
  • -x : 查看go build命令具體執(zhí)行了哪些操作
  • -n : 同上,只查看操作,但是不實(shí)際執(zhí)行
  • -v : 可以看到go build命令編譯的代碼包的名稱。搭配-a參數(shù)使用時(shí)很有用

go get 命令

命令go get會(huì)自動(dòng)下載代碼包,并把它們安裝到環(huán)境變量GOPATH包含的第1工作區(qū)的相應(yīng)目錄中。如果存在環(huán)境變量GOBIN,那么僅包含命令源碼文件的代碼包會(huì)被安裝到GOBIN指向的那個(gè)目錄。常用參數(shù)說(shuō)明:

  • -u : 下載并安裝代碼包,不論是否已存在
  • -d : 只下載代碼包,不安裝代碼包
  • -fix : 在下載代碼包后先運(yùn)行一個(gè)用于根據(jù)當(dāng)前Go語(yǔ)言版本修正代碼的工具,然后再安裝代碼包
  • -t : 同時(shí)下載測(cè)試所需的代碼包
  • -insecure : 允許通過(guò)非安全的網(wǎng)絡(luò)協(xié)議下載和安裝代碼包。比如:HTTP。

包的依賴管理

go get命令中并沒(méi)有提供依賴管理的功能。目前GitHub上有很多提供這類功能的第三方工具,比如glide、gb以及官方出品的dep、vgo等等,在它們的內(nèi)部大都是直接使用go get實(shí)現(xiàn)的。

自定義代碼包遠(yuǎn)程導(dǎo)入路徑

如果你想把你編寫的(被托管在不同的代碼托管網(wǎng)站上的)代碼包的遠(yuǎn)程導(dǎo)入路徑統(tǒng)一起來(lái),或者不希望讓你的代碼包中夾雜某個(gè)代碼托管網(wǎng)站的域名,那么你可以選擇自定義你的代碼包遠(yuǎn)程導(dǎo)入路徑。這種自定義的實(shí)現(xiàn)手段叫做“導(dǎo)入注釋”。
比如代碼實(shí)際存儲(chǔ)的位置是:github.com/golang/sync/
但是安裝的時(shí)候?qū)嶋H使用的命令是:go get golang.org/x/sync。這里就隱藏了github.com的域名,以及后面的部分路徑golang。

導(dǎo)入注釋

導(dǎo)入注釋必須出現(xiàn)在源碼文件的代碼包聲明語(yǔ)句的右邊,是一條單行注釋。被雙引號(hào)包裹的是一個(gè)符合導(dǎo)入路徑語(yǔ)法規(guī)則的字符串。下面是 github.com/golang/sync 下 semaphore/semaphore.go 里的導(dǎo)入注釋:

package semaphore // import "golang.org/x/sync/semaphore"

這樣加入導(dǎo)入注釋后,就無(wú)法用github的地址來(lái)下載這個(gè)包了。但是也無(wú)法用自定義的路徑來(lái)下載這個(gè)包,應(yīng)該自定義的路徑的網(wǎng)址還不能響應(yīng)這個(gè)請(qǐng)求

編寫網(wǎng)站的處理請(qǐng)求

編寫一個(gè)可處理HTTP請(qǐng)求的程序。將對(duì)這個(gè)url響應(yīng)的請(qǐng)求頭中加入如下的一行內(nèi)容:

<meta name="go-import" content="golang.org/x/sync git https://github.com/golang/sync">

這行內(nèi)容會(huì)被視為HTML文檔的元數(shù)據(jù)。這個(gè)就是go get命令的文檔中要求的寫法。它的模式是這樣的:

<meta name="go-import" content="import-prefix vcs repo-root">

content屬性中的import-prefix的位置上填入自定義的遠(yuǎn)程代碼包導(dǎo)入路徑的前綴。而vsc代表與版本控制系統(tǒng)有關(guān)的標(biāo)識(shí),比如git。至于repo-root,它應(yīng)該是與該處理程序關(guān)聯(lián)的路徑對(duì)應(yīng)的Github網(wǎng)站的URL,即實(shí)際網(wǎng)址。

這么做的好處是,可以強(qiáng)化你的品牌,而不是某個(gè)代碼托管網(wǎng)站的。順便還可以隱藏掉用戶ID,也就是域名后的部分路徑。
最主要的是,使你的代碼包導(dǎo)入路徑整齊劃一,如果代碼包分散在不同的遠(yuǎn)程路徑的話。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI