日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go标准命令详解0.2 go install

發(fā)布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go标准命令详解0.2 go install 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

搬運自github赫林的go_command_tutorial,絕對干貨,感謝作者。


0.2 go install

命令Go?install用于編譯并安裝指定的代碼包及它們的依賴包。當(dāng)指定的代碼包的依賴包還沒有被編譯和安裝時,該命令會先去處理依賴包。與go build命令一樣,傳給go install命令的代碼包參數(shù),應(yīng)該以導(dǎo)入路徑的形式提供。并且,go build命令的絕大多數(shù)標(biāo)記也都可以用于go install命令。實際上,go install命令只比go build命令多做了一件事,即:安裝編譯后的結(jié)果文件到指定目錄。

在對go install命令進行詳細(xì)說明之前,讓我們先回顧一下goc2p的目錄結(jié)構(gòu)。為了節(jié)省篇幅,我們在這里隱藏了代碼包中的源碼文件。如下:

$HOME/golang/goc2p:bin/pkg/src/cnet/logging/helper/ds/pkgtool/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我們看到,goc2p項目中有三個子目錄,分別是bin目錄、pkg目錄和src目錄?,F(xiàn)在只有src目錄中包含了一些目錄,而其他兩個目錄都是空的。

現(xiàn)在,我們來看看安裝代碼包的規(guī)則。

安裝代碼包

如果go install命令后跟的代碼包中僅包含庫源碼文件,那么go install命令會把編譯后的結(jié)果文件保存在源碼文件所在工作區(qū)的pkg目錄下。對于僅包含庫源碼文件的代碼包來說,這個結(jié)果文件就是對應(yīng)的代碼包歸檔文件。相比之下,我們在使用go build命令對僅包含庫源碼文件的代碼包進行編譯時,是不會在當(dāng)前工作區(qū)的src目錄和pkg目錄下產(chǎn)生任何結(jié)果文件的。結(jié)果文件會出于編譯的目的被生成在臨時目錄中,但并不會對當(dāng)前工作區(qū)目錄產(chǎn)生任何影響。

如果我們在執(zhí)行g(shù)o install命令時不后跟任何代碼包參數(shù),那么命令將試圖編譯當(dāng)前目錄所對應(yīng)的代碼包。比如,我們現(xiàn)在要安裝代碼包pkgtool:

hc@ubt:~/golang/goc2p/src/pkgtool$ go install -v -work WORK=D:\cygwin\tmp\go-build758586887 pkgtool
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

我們剛剛說過,執(zhí)行g(shù)o install命令后會對指定代碼包先編譯再安裝。其中,編譯代碼包使用了與go build命令相同的程序。所以,執(zhí)行g(shù)o install命令后也會首先建立一個名稱以go-build為前綴的臨時目錄。如果我們想強行重新安裝指定代碼包及其依賴包,那么就需要加入標(biāo)記-a:

hc@ubt:~/golang/goc2p/src/pkgtool$ go install -a -v -work WORK=/tmp/go-build014992994 runtime errors sync/atomic unicode unicode/utf8 sort sync io syscall bytes strings time bufio os path/filepath pkgtool
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

可以看到,代碼包pkgtool僅僅依賴了標(biāo)準(zhǔn)庫中的代碼包。

現(xiàn)在我們再來查看一下goc2p項目目錄:

$HOME/golang/goc2p:bin/pkg/linux_386/pkgtool.asrc/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

現(xiàn)在pkg目錄中多了一個子目錄。讀過本書第二章的讀者應(yīng)該已經(jīng)知道,linux_386被叫做平臺相關(guān)目錄。它的名字可以由${GOOS}_${GOARCH}來得到。其中,${GOOS}和${GOARCH}分別是環(huán)境變量GOOS和GOARCH的值。上述示例在計算架構(gòu)為386()且操作系統(tǒng)為Linux的計算機上運行。所以,這里的平臺相關(guān)目錄即為linux_386。我們還看到,在goc2p項目中的平臺相關(guān)目錄下存在一個文件,名稱是pkgtool.a。這就是代碼包pkgtool的歸檔文件,文件名稱是由代碼包名稱與“.a”后綴組合而來的。

實際上,代碼包的歸檔文件并不都會被保存在pkg目錄的平臺相關(guān)目錄下,還可能被保存在這個平臺相關(guān)目錄的子目錄下。 下面我們來安裝cnet/ctcp包:

hc@ubt:~/golang/goc2p/src/pkgtool$ go install -a -v -work ../cnet/ctcp WORK=/tmp/go-build083178213 runtime errors sync/atomic unicode unicode/utf8 math sort sync io syscall bytes strings bufio time strconv math/rand os reflect fmt log runtime/cgo logging net cnet/ctcp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

請注意,我們是在代碼包pkgtool對應(yīng)的目錄下安裝cnet/ctcp包的。我們使用了一個目錄相對路徑。

實際上,這種提供代碼包位置的方式被叫做本地代碼包路徑方式,也是被所有Go命令接受的一種方式,這包括之前已經(jīng)介紹過的go build命令。但是需要注意的是,本地代碼包路徑只能以目錄相對路徑的形式呈現(xiàn),而不能使用目錄絕對路徑。請看下面的示例:

hc@ubt:~/golang/goc2p/src/cnet/ctcp$ go install -v -work ~/golang/goc2p/src/cnet/ctcp can't load package: package /home/hc/golang/goc2p/src/cnet/ctcp: import "/home/hc/golang/goc2p/src/cnet/ctcp": cannot import absolute path
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

從上述示例中的命令提示信息我們可以看到,以目錄絕對路徑的形式提供代碼包位置是不會被Go命令認(rèn)可的。

這是由于Go認(rèn)為本地代碼包路徑的表示只能以“./”或“../”開始,再或者直接為“.”或“..”。而代碼包的代碼導(dǎo)入路徑又不允許以“/”開始。所以,這種用絕對路徑表示代碼包位置的方式也就不被支持了。

上述規(guī)則適用于所有Go命令。讀者可以自己嘗試一下,比如在執(zhí)行g(shù)o build命令時分別以代碼包導(dǎo)入路徑、目錄相對路徑和目錄絕對路徑的形式提供代碼包位置,并查看執(zhí)行結(jié)果。

我們已經(jīng)通過上面的示例強行的重新安裝了cnet/ctcp包及其依賴包?,F(xiàn)在我們再來看一下goc2p的項目目錄:

$HOME/golang/goc2p:bin/pkg/linux_386//cnetctcp.alogging.apkgtool.asrc/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我們發(fā)現(xiàn)在pkg目錄的平臺相關(guān)目錄下多了一個名為cnet的目錄,而在這個目錄下的就是名為ctcp.a的代碼包歸檔文件。由此我們可知,代碼包歸檔文件的存放路徑的相對路徑(相對于當(dāng)前項目的pkg目錄的平臺相關(guān)目錄)即為代碼包導(dǎo)入路徑除去最后一個元素后的路徑。而代碼包歸檔文件的名稱即為代碼包導(dǎo)入路徑中的最后一個元素再加“.a”后綴。再舉一個例子,如果代碼包導(dǎo)入路徑為x/y/z,則它的歸檔文件存放路徑的相對路徑即為x/y/,而這個歸檔文件的名稱即為z.a。

現(xiàn)在來看代碼包pkgtool的歸檔文件的存放路徑。因為它的導(dǎo)入路徑中只有一個元素,所以其歸檔文件就被直接存放到了goc2p項目的pkg目錄的平臺相關(guān)目錄下。

此外,我們還發(fā)現(xiàn)pkg目錄的平臺相關(guān)目錄下還有一個名為logging.a的文件。很顯然,我們并沒有顯式的安裝代碼包logging。這是怎么回事呢?這是因為go install命令在安裝指定的代碼包之前,會先去安裝指定代碼包的依賴包。當(dāng)依賴包被正確安裝后,指定的代碼包的安裝才會開始。由于代碼包cnet/ctcp依賴于代碼包logging,所以當(dāng)代碼包logging被成功安裝之后,代碼包cnet/ctcp才會被安裝。

還有一個問題:上述的安裝過程涉及到了那么多代碼包,那為什么goc2p項目的pkg目錄中只包含該項目中代碼包的歸檔文件呢?實際上,go install命令會把標(biāo)準(zhǔn)庫中的代碼包的歸檔文件存放到Go根目錄的pkg目錄中,而把指定代碼包依賴的第三方項目的代碼包的歸檔文件存放到那個項目的pkg目錄下。這樣就實現(xiàn)了Go語言標(biāo)準(zhǔn)庫代碼包的歸檔文件與用戶代碼包的歸檔文件,以及處在不同工作區(qū)的用戶代碼包的歸檔文件之間的徹底分離。

安裝命令源碼文件

除了安裝代碼包之外,go install命令還可以安裝命令源碼文件。為了看到安裝命令源碼文件是goc2p項目目錄的變化,我們先把該目錄還原到原始狀態(tài),即清除bin子目錄和pkg子目錄下的所有目錄和文件。然后,我們來安裝代碼包helper/ds下的命令源碼文件showds.go,如下:

hc@ubt:~/golang/goc2p/src$ go install helper/ds/showds.go go install: no install location for directory /home/hc/golang/goc2p/src/helper/ds outside GOPATH
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

這次我們沒能成功安裝。該Go命令認(rèn)為目錄/home/hc/golang/goc2p/src/helper/ds不在環(huán)境GOPATH中。我們可以通過Linux的echo命令來查看一下環(huán)境變量GOPATH的值:

hc@ubt:~/golang/goc2p/src$ echo $GOPATH /home/hc/golang/lib:/home/hc/golang/goc2p
  • 1
  • 2
  • 1
  • 2

環(huán)境變量GOPATH的值中確實包含了goc2p項目的根目錄。這到底是怎么回事呢?

作者通過查看Go命令的源碼文件($GOROOT/src/go/*.go)找到了其根本原因。在上一小節(jié)我們提到過,在環(huán)境變量GOPATH中包含多個工作區(qū)目錄路徑時,我們需要在編譯命令源碼文件前先對環(huán)境變量GOBIN進行設(shè)置。實際上,這個環(huán)境變量所指的目錄路徑就是命令程序生成的結(jié)果文件的存放目錄。go install命令會把相應(yīng)的可執(zhí)行文件放置到這個目錄中。

由于命令go build在編譯庫源碼文件后不會產(chǎn)生任何結(jié)果文件,所以自然也不用會在意結(jié)果文件的存放目錄。在該命令編譯單一的命令源碼文件時,在結(jié)果文件存放目錄無效的情況下會將結(jié)果文件(也就是可執(zhí)行文件)存放到執(zhí)行該命令時所在的目錄下。因此,即使環(huán)境變量GOBIN的值無效,我們在執(zhí)行g(shù)o build命令時也不會見到這個錯誤提示信息。

然而,go install命令中一個很重要的步驟就是將結(jié)果文件(歸檔文件或者可執(zhí)行文件)存放到相應(yīng)的目錄中。所以,命令go install在安裝命令源碼文件時,如果環(huán)境變量GOBIN的值無效,則它會在最后檢查結(jié)果文件存放目錄的時候發(fā)現(xiàn)這一問題,并打印與上述示例所示內(nèi)容類似的錯誤提示信息,最后直接退出。

這個錯誤提示信息在我們安裝多個庫源碼文件時也有可能遇到。示例如下:

hc@ubt:~/golang/goc2p/src/pkgtool$ go install envir.go fpath.go ipath.go pnode.go util.go go install: no install location for directory /home/hc/golang/goc2p/src/pkgtool outside GOPATH
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

而且,在我們?yōu)榄h(huán)境變量GOBIN設(shè)置了正確的值之后,這個錯誤提示信息仍然會出現(xiàn)。這是因為,只有在安裝命令源碼文件的時候,命令程序才會將環(huán)境變量GOBIN的值作為結(jié)果文件的存放目錄。而在安裝庫源碼文件時,在命令程序內(nèi)部的代表結(jié)果文件存放目錄路徑的變量不會被賦值。最后,命令程序會發(fā)現(xiàn)它依然是個無效的空值。所以,命令程序會同樣返回一個關(guān)于“無安裝位置”的錯誤。這就引出一個結(jié)論,我們只能使用安裝代碼包的方式來安裝庫源碼文件,而不能在go install命令羅列并安裝它們。另外,go install命令目前無法接受標(biāo)記-o以自定義結(jié)果文件的存放位置。這也從側(cè)面說明了go install命令當(dāng)前還不支持針對庫源碼文件的安裝操作。

單從上述問題來講,Go工具在執(zhí)行錯誤識別及其提示信息的細(xì)分方面還沒有做到最好。

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的go标准命令详解0.2 go install的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产男女自拍 | 五月天国产精品 | 加勒比成人av | 中文字幕乱轮 | 精品国产乱码久久久久久1区2区 | 国产精品电影 | 理论片中文| 国产午夜福利一区二区 | 色二区 | 精彩毛片 | 91毛片视频 | 丝袜熟女一区二区三区 | 成年人黄色 | 精品日韩在线观看 | 99久久九九 | 亚洲综合在| 国产精品一区二区av | 国产一级视频 | 少妇导航av | 秘密基地免费观看完整版中文 | 超碰在线进入 | 午夜伦伦电影理论片费看 | 超碰成人在线免费观看 | 亚洲石原莉奈一区二区在线观看 | 非洲黑人狂躁日本妞 | 日韩欧美在线一区二区三区 | 精品国产无码AV | 午夜在线播放视频 | 日本成人福利视频 | 欧美日本在线观看 | 男人日女人逼 | 日韩美女性生活 | 亚洲精品中文字幕在线观看 | xx性欧美肥妇精品久久久久久 | 国产swag在线观看 | 中文字幕在线观看免费 | 六月丁香激情网 | 蜜臀av免费一区二区三区水牛 | 久久综合久久久久 | 日韩欧美一卡二卡 | 成人伊人网站 | 高清无码一区二区在线观看吞精 | 国产jizz18女人高潮 | 嫩草影院懂你的影院 | 国产suv精品一区二区四 | 在线观看麻豆av | 亚色av| 男生和女生一起差差差很痛的视频 | 亚洲综合不卡 | 日本美女黄网站 | 欧美黄色一区二区三区 | 日韩免费大片 | 国产精品1区2区3区 在线看黄的网站 | 久久少妇视频 | 欧美性区| 美女爆乳18禁www久久久久久 | 视色网 | 亚洲大尺度在线观看 | 国产精品7 | 老司机福利精品 | 老妇裸体性激交老太视频 | 长篇h版少妇沉沦交换 | 国产女人水真多18毛片18精品 | av色先锋 | 成人动漫在线播放 | 9l视频自拍蝌蚪9l视频成人 | 国产91色在线 | 婷婷久久综合网 | 欧洲性生活视频 | 欧美在线小视频 | 韩国一区二区三区在线观看 | 免费成人深夜夜行网站视频 | 性色av网站| 九九久久精品 | 五月婷婷六月丁香综合 | 国产三级视频在线播放 | 日韩免费在线观看视频 | 日韩精品一区二区三区在线视频 | 日韩av网址在线观看 | 亚洲色图欧美视频 | 黑人欧美一区二区三区 | 五月天久久 | 一区二区三区偷拍 | 青青草综合网 | 日韩中文字幕一区二区三区 | 99ri精品| 侵犯亲女在线播放视频 | 在线黄色av| 黄色大片网站在线观看 | 色在线综合 | 成人短视频在线观看 | 欧美黑人又粗又大高潮喷水 | 蜜桃91丨九色丨蝌蚪91桃色 | 久久久久激情 | 亚洲欧美中文日韩在线v日本 | 国产精选在线 | 日本人和亚洲人zjzjhd | 国产精品国产三级国产aⅴ中文 | aa片在线观看视频在线播放 |