1. 「Go官方出品」快速掌握Go1.18新特性:工作區(qū)

        共 3802字,需瀏覽 8分鐘

         ·

        2022-04-11 15:18

        1

        熟悉工作區(qū)

        Beth Brown, for the Go team

        5 April 2022

        Go 1.18為Go增加了工作區(qū)模式,使你可以同時(shí)在多個(gè)模塊上工作。

        你可以通過(guò)訪問(wèn)下載頁(yè)面獲得Go 1.18。發(fā)布說(shuō)明有關(guān)于所有變化的更多細(xì)節(jié)。

        2

        工作區(qū)

        Go 1.18中的工作區(qū)可以讓你同時(shí)處理多個(gè)模塊,而不必為每個(gè)模塊編輯go.mod文件。在解決依賴(lài)關(guān)系時(shí),工作區(qū)中的每個(gè)模塊都被視為根模塊。

        以前,如果要在一個(gè)模塊中增加一個(gè)功能,并在另一個(gè)模塊中使用,你需要在第一個(gè)模塊中發(fā)布修改,或者編輯依賴(lài)模塊的go.mod文件,為你的本地未發(fā)布的模塊變化添加replace指令。為了不出錯(cuò)地發(fā)布,你必須在向第一個(gè)模塊發(fā)布本地修改后,從依賴(lài)模塊的go.mod文件中刪除replace指令。

        通過(guò)Go工作區(qū),你可以使用工作區(qū)目錄根部的go.work文件來(lái)控制所有的依賴(lài)關(guān)系。go.work文件有usereplace指令,可以覆蓋各個(gè)go.mod文件,所以不需要單獨(dú)編輯每個(gè)go.mod文件。

        你可以通過(guò)運(yùn)行go work init來(lái)創(chuàng)建一個(gè)工作區(qū),并將模塊目錄列表作為空格分隔的參數(shù)。工作區(qū)不需要包含你正在使用的模塊。init命令創(chuàng)建一個(gè)go.work文件,列出工作區(qū)的模塊。如果你在運(yùn)行go work init時(shí)沒(méi)有參數(shù),該命令會(huì)創(chuàng)建一個(gè)空的工作區(qū)。

        要向工作區(qū)添加模塊,可以運(yùn)行go work use [moddir]?或手動(dòng)編輯go.work文件。運(yùn)行go work use -r來(lái)遞歸添加參數(shù)目錄中帶有go.mod文件的目錄到你的工作區(qū)。如果一個(gè)目錄沒(méi)有go.mod文件,或者不再存在,使用use指令的目錄將會(huì)從go.work文件中刪除。

        go.work文件的語(yǔ)法與go.mod文件相似,包含以下指令:

        • go:go工具鏈的版本,例如:go 1.18

        • use:將磁盤(pán)上的一個(gè)模塊添加到工作區(qū)的主模塊集合中。它的參數(shù)是包含該模塊go.mod文件的目錄的相對(duì)路徑。use指令不會(huì)在指定目錄的子目錄中添加模塊。

        • replace: 與go.mod文件中的replace指令類(lèi)似,go.work文件中的replace指令用其他地方的內(nèi)容替換一個(gè)模塊的*特定版本*或*所有版本*。

        3

        工作流

        工作區(qū)是靈活的,支持各種工作流程。以下部分是對(duì)我們認(rèn)為最常見(jiàn)的工作區(qū)使用的簡(jiǎn)要概述。

        在上游模塊中增加一個(gè)功能,并在自己的模塊中使用它

        1. 為你的工作區(qū)創(chuàng)建一個(gè)目錄。

        2. 克隆你要編輯的上游模塊。如果你以前沒(méi)有為Go貢獻(xiàn)過(guò),請(qǐng)閱讀貢獻(xiàn)指南。

        3. 將你的功能添加到上游模塊的本地版本中。

        4. 在工作區(qū)文件夾中運(yùn)行go work init [path-to-upstream-mod-dir]?。

        5. 對(duì)你自己的模塊進(jìn)行修改,以實(shí)現(xiàn)添加到上游模塊的功能。

        6. 在工作區(qū)文件夾中運(yùn)行go work use [path-to-your-module]。

        go work use命令將模塊的路徑添加到你的go.work文件中:

        ??go?1.18
        ???
        ???use?(
        ??????????./path-to-upstream-mod-dir
        ??????????./path-to-your-module
        ???)
        1. 使用添加到上游模塊的新功能運(yùn)行并測(cè)試你的模塊。

        2. 發(fā)布帶有新功能的上游模塊。

        3. 使用新功能發(fā)布你的模塊。

        在同一個(gè)資源庫(kù)中與多個(gè)相互依賴(lài)的模塊一起工作

        在同一版本庫(kù)中處理多個(gè)模塊時(shí),go.work文件定義了工作區(qū),而不是在每個(gè)模塊的go.mod文件中使用replace指令。

        1. 為你的工作區(qū)創(chuàng)建一個(gè)目錄。

        2. 克隆你想編輯的模塊的版本庫(kù)。這些模塊不一定要在你的工作區(qū)文件夾中,因?yàn)槟憧梢杂?code style="font-size: 13.6px;font-family: mononoki, Consolas, "Liberation Mono", Menlo, Courier, monospace, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "Segoe UI Symbol", "Android Emoji", EmojiSymbols;padding: 0.2em 0.4em;border-radius: 3px;word-break: break-word;background-size: 20px 20px;white-space: pre-wrap;background-color: rgba(27, 31, 35, 0.05);">use指令指定每個(gè)模塊的相對(duì)路徑。

        3. 在你的工作區(qū)目錄下運(yùn)行go work init [path-to-module-one] [path-to-module-two]。

        例子。你正在開(kāi)發(fā)example.com/x/tools/groundhog,它依賴(lài)于example.com/x/tools模塊中的其他軟件包。

        你克隆了軟件庫(kù),然后在你的工作區(qū)文件夾中運(yùn)行go work init tools tools/groundhog

        你的go.work文件的內(nèi)容類(lèi)似于以下內(nèi)容:

        ??go?1.18
        ???
        ???use?(
        ???????????./tools
        ???????????./tools/groundhog
        ???)

        在?tool模塊中做出的任何本地修改都將被你的工作區(qū)中的tool/groundhog所使用。

        在依賴(lài)性配置之間進(jìn)行切換

        為了用不同的依賴(lài)配置測(cè)試你的模塊,你可以用獨(dú)立的go.work文件創(chuàng)建多個(gè)工作區(qū),或者保留一個(gè)工作區(qū),在一個(gè)go.work文件中注釋掉你不需要的use指令。

        要?jiǎng)?chuàng)建多個(gè)工作區(qū)。

        1. 為不同的依賴(lài)性需求創(chuàng)建單獨(dú)的目錄。

        2. 在每個(gè)工作區(qū)的目錄中運(yùn)行go work init。

        3. 通過(guò)?go work use [path-to-dependency]在每個(gè)目錄中添加你想要的依賴(lài)性。

        4. 在每個(gè)工作區(qū)目錄中運(yùn)行go run [path-to-your-module],以使用其go.work文件所指定的依賴(lài)項(xiàng)。

        要在同一工作區(qū)測(cè)試不同的依賴(lài)關(guān)系,請(qǐng)打開(kāi)go.work文件,添加或注釋所需的依賴(lài)關(guān)系。

        還在使用GOPATH嗎?

        也許使用工作區(qū)會(huì)改變你的想法。GOPATH用戶可以使用位于其GOPATH目錄底部的go.work文件來(lái)解決他們的依賴(lài)關(guān)系。工作區(qū)的目的不是要完全重新創(chuàng)建所有的GOPATH工作流程,但它們可以創(chuàng)建一個(gè)設(shè)置,分享GOPATH的一些便利,同時(shí)仍然提供模塊的好處。

        要為GOPATH創(chuàng)建一個(gè)工作區(qū):

        1. 在你的GOPATH目錄下運(yùn)行go work init

        2. 要在你的工作區(qū)中使用一個(gè)本地模塊或特定版本作為依賴(lài),運(yùn)行go work use [path-to-module]

        3. 要替換你的模塊的go.mod文件中的現(xiàn)有依賴(lài)關(guān)系,請(qǐng)使用go work replace [path-to-module]。

        4. 要添加你的GOPATH或任何目錄中的所有模塊,運(yùn)行go work use -r來(lái)遞歸地添加有go.mod文件的目錄到你的工作區(qū)。如果一個(gè)目錄沒(méi)有go.mod文件,或者不再存在,使用use指令的目錄將會(huì)從?go.work文件中刪除。

        注意:如果你有沒(méi)有go.mod文件的項(xiàng)目,你想把它添加到工作區(qū),請(qǐng)換到它們的項(xiàng)目目錄,運(yùn)行go mod init,然后用go work use [path-to-module]把新模塊添加到你的工作區(qū)。

        4

        工作區(qū)指令

        除了go work initgo use之外,Go 1.18為工作區(qū)引入了以下命令:

        • go work sync:將go.work文件中的依賴(lài)關(guān)系推回到每個(gè)工作區(qū)模塊的go.mod文件中。

        • go work edit:為編輯go.work提供一個(gè)命令行接口,主要供工具或腳本使用。

        模塊感知的構(gòu)建命令和一些?go mod子命令會(huì)檢查?GOWORK環(huán)境變量,以確定它們是否處于工作區(qū)環(huán)境中。

        如果GOWORK變量命名的文件路徑以.work結(jié)尾,則工作區(qū)模式被激活。要確定哪個(gè)go.work文件正在被使用,請(qǐng)運(yùn)行go env GOWORK。如果go命令不在工作區(qū)模式下,則輸出為空。

        當(dāng)工作區(qū)模式被啟用時(shí),go.work文件被解析以確定工作區(qū)模式的三個(gè)參數(shù):一個(gè)Go版本,一個(gè)目錄列表,以及一個(gè)替換列表。

        在工作區(qū)模式下可以嘗試一些命令(前提是你已經(jīng)知道它們的作用!):

        ?go?work?init
        go?work?sync
        go?work?use
        go?list
        go?build
        go?test
        go?run
        go?vet

        5

        編輯器體驗(yàn)的改進(jìn)

        我們對(duì)Go語(yǔ)言服務(wù)器gopls和VSCode Go擴(kuò)展的升級(jí)感到特別興奮,這使得在兼容LSP的編輯器中處理多個(gè)模塊的工作變得順利而有意義。

        查找引用、代碼補(bǔ)全和轉(zhuǎn)到定義在工作區(qū)中跨模塊工作。版本0.8.1的gopls引入了診斷、完成、格式化和對(duì)go.work文件的懸停。你可以用任何LSP兼容的編輯器來(lái)利用這些gopls的功能。

        編輯的具體說(shuō)明

        • 最新的vscode-go版本允許通過(guò)Go狀態(tài)欄的快速選擇菜單快速訪問(wèn)你的工作區(qū)的go.work文件。

        • GoLand支持工作區(qū),并計(jì)劃為go.work文件增加語(yǔ)法高亮和代碼完成。

        關(guān)于在不同編輯器中使用gopls的更多信息,請(qǐng)看gopls文檔。

        6

        接下來(lái)是什么?

        • 下載并安裝Go 1.18。

        • 嘗試通過(guò)Go工作區(qū)教程來(lái)使用工作區(qū)。

        • 如果你在使用工作區(qū)時(shí)遇到任何問(wèn)題,或者想提出一些建議,請(qǐng)?zhí)峤灰粋€(gè)issue。

        • 閱讀工作區(qū)維護(hù)文檔。

        • 探索在單一模塊外工作的模塊命令,包括go work initgo work sync等等。


        ????

        原文信息

        ●? 原文地址:https://go.dev/blog/get-familiar-with-workspaces


        ●? ?原文作者:golang.org


        ●??本文永久鏈接:https://github.com/gocn/translator/edit/master/2022/w15_Get_familiar_with_workspaces.md


        ●? ?譯者:zxmfke


        ●?? 校對(duì):cvley



        想要了解更多與 GO 語(yǔ)言相關(guān)的資訊,請(qǐng)?jiān)诠娞?hào)的對(duì)話框內(nèi),發(fā)送關(guān)鍵詞【實(shí)戰(zhàn)群】掃碼入群~



        瀏覽 80
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 免费看靠逼视频 | 国产欧美性爱 | 俺去干 | 亲嘴伸进内衣揉胸口激烈小说 | 天天日女人 |