<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go 1.16中Module功能新變化

          共 3713字,需瀏覽 8分鐘

           ·

          2021-02-20 14:20

          原文:https://blog.golang.org/go116-module-changes


          作者:Jay Conrod


          翻譯:Kevin



          希望您喜歡Go 1.16! 這個(gè)版本有很多新功能,特別是對(duì)Module而言。發(fā)行說明中簡(jiǎn)要介紹了這些變化,但讓我們深入發(fā)掘一下其中的一些變化。

          Module功能默認(rèn)開啟

          go命令現(xiàn)在默認(rèn)以module-aware模式構(gòu)建包,即使沒有go.mod文件存在。這是向在所有項(xiàng)目中使用Module功能邁出的一大步。

          通過設(shè)置GO111MODULE環(huán)境變量為off,仍然可以在GOPATH模式下構(gòu)建包。你也可以將GO111MODULE設(shè)置為auto,只有當(dāng)當(dāng)前目錄或任何父目錄中存在go.mod文件時(shí)才啟用module-aware模式。這在以前是默認(rèn)的。請(qǐng)注意,您可以使用go env -w來(lái)永久地設(shè)置GO111MODULE和其他變量。

          go?env?-w?GO111MODULE=auto

          我們計(jì)劃在 Go 1.17 中放棄對(duì)GOPATH模式的支持。換句話說,Go 1.17將忽略GO111MODULE。如果您的項(xiàng)目沒有以module-aware模式構(gòu)建,現(xiàn)在是時(shí)候遷移了。如果有問題妨礙您遷移,請(qǐng)考慮提交問題或體驗(yàn)報(bào)告。

          不會(huì)自動(dòng)更改 go.mod 和 go.sum

          在之前的版本中,當(dāng)go命令發(fā)現(xiàn)go.modgo.sum有問題時(shí),比如缺少require指令或缺少sum,它會(huì)嘗試自動(dòng)修復(fù)問題。我們收到了很多反饋,認(rèn)為這種行為是出乎大家意料的,尤其是對(duì)于像go list這樣通常不會(huì)產(chǎn)生副作用的命令。自動(dòng)修復(fù)并不總是可取的:如果一個(gè)導(dǎo)入的包沒有被任何需要的Module提供,go命令會(huì)添加一個(gè)新的依賴關(guān)系,可能會(huì)觸發(fā)普通依賴關(guān)系的升級(jí)。即使是拼寫錯(cuò)誤的導(dǎo)入路徑也會(huì)導(dǎo)致(失敗的)網(wǎng)絡(luò)查找。

          在 Go 1.16 中,module-aware命令在發(fā)現(xiàn)go.modgo.sum中的問題后會(huì)報(bào)告一個(gè)錯(cuò)誤,而不是嘗試自動(dòng)修復(fù)問題。在大多數(shù)情況下,錯(cuò)誤信息建議使用命令來(lái)修復(fù)問題。

          $?go?build
          example.go:3:8:?no?required?module?provides?package?golang.org/x/net/html;?to?add?it:
          ????go?get?golang.org/x/net/html
          $?go?get?golang.org/x/net/html
          $?go?build

          和之前一樣,如果存在vendor目錄,go命令可能會(huì)使用該目錄(詳見Vendoring)。像go getgo mod tidy這樣的命令仍然會(huì)修改go.modgo.sum,因?yàn)樗鼈兊闹饕康氖枪芾硪蕾囮P(guān)系。

          在特定版本上安裝可執(zhí)行文件

          go install命令現(xiàn)在可以通過指定@version后綴來(lái)安裝特定版本的可執(zhí)行文件。

          go?install?golang.org/x/tools/[email protected]

          當(dāng)使用這種語(yǔ)法時(shí),go install命令會(huì)從該Module的制定版本安裝,而忽略當(dāng)前目錄和父目錄中的任何 go.mod 文件。(如果沒有@version后綴,go install會(huì)像往常一樣繼續(xù)運(yùn)行,使用當(dāng)前Module的go.mod中列出的版本要求和替換來(lái)構(gòu)建程序。)

          我們?cè)?jīng)推薦使用go get -u程序來(lái)安裝可執(zhí)行文件,但這種使用方式對(duì)go.mod中添加或更改Module版本需求的意義造成了太多的混淆。而為了避免意外修改go.mod,人們開始建議使用更復(fù)雜的命令,比如:

          cd?$HOME;?GO111MODULE=on?go?get?program@latest

          現(xiàn)在我們都可以用go install program@latest來(lái)代替。詳情請(qǐng)看go install。

          為了消除使用哪個(gè)版本的歧義,當(dāng)使用這種安裝語(yǔ)法時(shí),對(duì)程序的go.mod文件中可能存在的指令有一些限制。特別是,至少在目前,替換和排除指令是不允許的。從長(zhǎng)遠(yuǎn)來(lái)看,一旦新的go install program@version在足夠多的用例中運(yùn)行良好,我們計(jì)劃讓go get停止安裝命令二進(jìn)制文件。詳情請(qǐng)參見issue 43684。

          Module撤回

          您是否曾經(jīng)在Module版本準(zhǔn)備好之前不小心發(fā)布過?或者您是否在版本發(fā)布后就發(fā)現(xiàn)了一個(gè)需要快速修復(fù)的問題?發(fā)布的版本中的錯(cuò)誤是很難糾正的。為了保持Module構(gòu)建的確定性,一個(gè)版本在發(fā)布后不能被修改。即使你刪除或更改了版本標(biāo)簽,proxy.golang.org和其他代理可能已經(jīng)有了原始版本的緩存。

          Module作者現(xiàn)在可以使用go.mod中的retract指令撤回Module版本。撤回的版本仍然存在,并且可以被下載(所以依賴它的構(gòu)建不會(huì)中斷),但在解析@latest這樣的版本時(shí),go命令不會(huì)自動(dòng)選擇它,go getgo list -m -u會(huì)打印關(guān)于現(xiàn)有使用版本的警告。

          例如,假設(shè)一個(gè)流行庫(kù)example.com/lib的作者發(fā)布了v1.0.5,然后發(fā)現(xiàn)了一個(gè)新的安全問題。他們可以在他們的go.mod文件中添加如下指令。

          //?Remote-triggered?crash?in?package?foo.?See?CVE-2021-01234.
          retract?v1.0.5

          接下來(lái),作者可以標(biāo)記并推送v1.0.6版本,即新的最高版本。在這之后,已經(jīng)依賴v1.0.5的用戶在檢查更新或升級(jí)依賴的軟件包時(shí),就會(huì)被通知版本撤回。通知信息可能會(huì)包含來(lái)自retract指令上方注釋的文字。

          $?go?list?-m?-u?all
          example.com/lib?v1.0.0?(retracted)
          $?go?get?.
          go:?warning:?example.com/[email protected]:?retracted?by?module?author:
          ????Remote-triggered?crash?in?package?foo.?See?CVE-2021-01234.
          go:?to?switch?to?the?latest?unretracted?version,?run:
          ????go?get?example.com/lib@latest

          關(guān)于交互式的、基于瀏覽器的使用指南,請(qǐng)查看play-with-go.dev上的Retract Module Versions。可以查看retract指令文檔以了解語(yǔ)法細(xì)節(jié)。

          用GOVCS控制版本管理工具

          go命令可以從proxy.golang.org這樣的鏡像中下載Module源代碼,或者直接從使用git、hgsvn、bzrfossil的版本管理倉(cāng)庫(kù)中下載。直接的版本控制訪問是很重要的,特別是對(duì)于那些在代理上無(wú)法使用的私有Module,但這也是一個(gè)潛在的安全問題:版本控制工具中的一個(gè)bug可能會(huì)被惡意服務(wù)器利用,運(yùn)行非預(yù)期的代碼。

          Go 1.16引入了一個(gè)新的配置變量GOVCS,讓用戶可以指定哪些Module可以使用特定的版本控制工具。GOVCS接受一個(gè)以逗號(hào)分隔的pattern:vcslist規(guī)則列表。pattern是一個(gè)path.Match模式,匹配一個(gè)Module路徑的一個(gè)或多個(gè)前綴元素。特殊模式public和private匹配公共和私有Module(private被定義為由GOPRIVATE中的模式匹配的Module;public是其他所有Module)。vcslist是一個(gè)以管道符分隔的允許的版本控制命令列表,或關(guān)鍵字alloff。

          例如

          GOVCS=github.com:git,evil.com:off,*:git|hg

          在此設(shè)置下,路徑在github.com上的Module可以使用git下載;路徑在evil.com上的Module不能使用任何版本管理程序下載,其他所有路徑(*匹配所有)可以使用githg下載。

          如果沒有設(shè)置GOVCS,或者一個(gè)Module不符合任何模式,go命令就會(huì)使用這個(gè)默認(rèn)值:公共Module允許使用githg,私有Module允許使用所有工具。只允許GitMercurial的理由是,這兩個(gè)系統(tǒng)作為不受信任的服務(wù)器的客戶端運(yùn)行的問題最受關(guān)注。相比之下,Bazaar、FossilSubversion主要是在受信任的、經(jīng)過認(rèn)證的環(huán)境中使用,作為攻擊面的審查程度不高。也就是說,默認(rèn)的設(shè)置是

          GOVCS=public:git|hg,private:all

          更多細(xì)節(jié)請(qǐng)參見使用GOVCS控制版本管理工具

          下一步?

          我們希望您覺得這些功能很有用。我們已經(jīng)在努力為Go 1.17開發(fā)新的Module功能,特別是懶惰Module加載,這將使Module加載過程更快、更穩(wěn)定。和以往一樣,如果您遇到新的bug,請(qǐng)?jiān)趩栴}跟蹤上告訴我們。Happy coding!


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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲V免费看 | 欧美成人在线网址 | 美国 日本 韩国三级三级三级黄色A在线播放 | 激情五月婷婷网 | 免费看黄A级毛片成人片 |