<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 新功能:Go Module 支持版本撤回

          共 6076字,需瀏覽 13分鐘

           ·

          2021-02-20 14:20

          原文地址:https://golangtutorial.dev/tips/retract-go-module-versions/

          原文作者:Arunkumar Gudelli

          本文永久鏈接:https:/github.com/gocn/translator/blob/master/2021/w8_go_retracting.md

          譯者:咔嘰咔嘰

          校對:fivezh

          Go 1.16 的一個很酷的功能是支持 Go Module 版本撤回。

          什么是撤回?

          我們使用版本機(jī)制將 Go Module 發(fā)布到 Github。

          假設(shè)其中一個模塊帶著錯誤并以新的版本號 (v0.1.0) 被發(fā)布到了產(chǎn)品中。

          與此同時,我們發(fā)現(xiàn)了這個錯誤,并發(fā)布了一個新的修復(fù)版本 (v0.2.0)。

          我們不能修改 v0.1.0 中的代碼,可能有些人已經(jīng)在使用它們了。

          在此之前我們沒有好辦法去通知用戶不要使用這個版本。

          Go 1.16 撤回功能通過將版本標(biāo)記為 retract 來解決這個問題。

          我們通過一個例子來進(jìn)一步理解。

          首先檢查你的 Go 版本,我使用的是 Go 1.16 RC1 版本。

          go1.16rc1?version

          go?version?go1.16rc1?windows/amd64

          按照 Go-1.16 RC1 released 文章中提到的方法安裝 Go 1.16 RC1。

          我為這個示例創(chuàng)建了一個 github 倉庫。

          git?clone?https://github.com/arungudelli/Retract-Go-Module-Versions.git

          并且使用 Go 1.16 版本創(chuàng)建了一個名為 hello 的模塊。

          go1.16rc1?mod?init?github.com/arungudelli/Retract-Go-Module-Versions

          go:?creating?new?go.mod:?module?github.com/arungudelli/Retract-Go-Module-Versions
          go:?to?add?module?requirements?and?sums:go?mod?tidy

          它將生成 go.mod 文件。

          module?github.com/arungudelli/Retract-Go-Module-Versions

          go?1.16

          并創(chuàng)建了一個名為 hello.go 的文件,內(nèi)容如下。

          package?hello

          //?Welcome?Message
          func?Welcome()?string?{
          ????return?"Hello,?gophers?From?Go?1.16"
          }

          我的初始版本已經(jīng)準(zhǔn)備就緒。所以,我需要為模塊添加標(biāo)簽并發(fā)布。

          >git?tag?v0.1.0
          >git?push?-q?origin?v0.1.0

          現(xiàn)在我們能在 github 上看到這個版本了。

          為了使用這個模塊,我創(chuàng)建了一個 go 程序,它將使用 hello.go 模塊中的功能。

          go1.16rc1?mod?init?gopher116

          go.mod 文件。

          module?gopher116

          go?1.16

          gopher116.go 的內(nèi)容如下。

          package?main

          import?(
          ????"fmt"

          ????"github.com/arungudelli/Retract-Go-Module-Versions"
          )

          func?main()?{
          ????fmt.Println(hello.Welcome())
          }

          上述的代碼包含以下功能,

          1. 導(dǎo)入 github.com/arungudelliRetract-Go-Module-Versions 包,這樣我們就有了對這個包的依賴。
          2. 使用 fmt.Println 打印 hello.Welcome() 返回的消息。

          要添加對 github.com/arungudelliRetract-Go-Module-Versions 的依賴,需要使用以下命令。

          >go1.16rc1?get?github.com/arungudelli/[email protected]

          go:?downloading?github.com/arungudelli/Retract-Go-Module-Versions?v0.1.0
          go?get:?added?github.com/arungudelli/Retract-Go-Module-Versions?v0.1.0

          現(xiàn)在我們使用 go run 命令來運(yùn)行這段程序。

          >go1.16rc1?run?.

          //Hello,?gophers?From?Go?1.16

          發(fā)布一個新的版本

          假設(shè)我們需要修改 gopher116.go 的消息內(nèi)容,修改后的代碼如下。

          package?hello

          //Welcom?message
          func?Welcome()?string?{
          ????return?"Hello,?gophers?From?Go?1.15"
          }

          并發(fā)布了標(biāo)簽版本為 2(v0.2.0)的包。

          >git?tag?v0.2.0
          >git?push?-q?origin?v0.2.0

          我們的程序發(fā)現(xiàn)依賴的模塊有新版本發(fā)布,然后更新了包。

          >?go1.16rc1?get?github.com/arungudelli/[email protected]
          go:?downloading?github.com/arungudelli/Retract-Go-Module-Versions?v0.2.0
          go?get:?upgraded?github.com/arungudelli/Retract-Go-Module-Versions?v0.1.0?=>?v0.2.0

          隨后重新運(yùn)行程序。

          \>go1.16rc1?run?.?//Hello,?gophers?From?Go?1.15

          我們發(fā)現(xiàn)了一個錯誤,即程序中的 Go 1.16 被錯誤的修改為 Go 1.15

          撤回 Go Module 版本

          GO 1.16 版自帶撤回功能。

          作為一個發(fā)布者,我們必須修復(fù)代碼,并通知用戶版本中所發(fā)生的錯誤。

          要將 Go module 的版本標(biāo)記為撤回,需要使用 ‘-retract’ 標(biāo)志。

          使用 go mod edit 命令修改 go.mod 文件,然后在后面加上 -retract 標(biāo)志。

          go1.16rc1?mod?edit?-retract=v0.2.0

          這會使 go.mod 文件中添加上撤回的版本信息。

          module?github.com/arungudelli/Retract-Go-Module-Versions

          go?1.16

          retract?v0.2.0

          更好的做法是在上面的 retract 指令中添加注釋,為什么這個版本需要撤回。

          module?github.com/arungudelli/Retract-Go-Module-Versions

          go?1.16

          //?Mistake?happened?in?the?version?DO?NOT?USE
          retract?v0.2.0

          現(xiàn)在發(fā)布新版本的變更。

          >git?tag?v0.3.0
          >git?push?-q?origin?v0.3.0

          在 Go 中查詢撤回的 Module 版本

          我們的 gopher116.go 仍然使用 v0.2.0 版本。

          因此,要想知道 Go 中已撤回的模塊版本,可以使用 go list -m -u all 命令。

          >go1.16rc1?list?-m?-u?all
          gopher116
          github.com/arungudelli/Retract-Go-Module-Versions?v0.2.0?(retracted)?[v0.3.0]

          現(xiàn)在版本 2.0 被標(biāo)記為 (retracted)

          所以我們需要升級到版本 3(v0.3.0)。

          >go1.16rc1?get?github.com/arungudelli/[email protected]

          go:?downloading?github.com/arungudelli/Retract-Go-Module-Versions?v0.3.0
          go?get:?upgraded?github.com/arungudelli/Retract-Go-Module-Versions?v0.2.0?=>?v0.3.0

          然后重新運(yùn)行程序

          >go1.16rc1?run?.

          //Hello,?gophers?From?Go?1.15

          還是顯示的老信息。

          因為在第 3 版中,我把第 2 版標(biāo)記為撤回,但代碼沒有改變。

          所以我們需要把第 3 版也標(biāo)記為撤回。

          撤回多個 Go Module 版本

          編輯 go.mod文件,并使用下面的命令將版本 3 標(biāo)記為撤回。

          go1.16rc1?mod?edit?-retract=v0.3.0

          新的 go.mod 文件內(nèi)容如下。

          module?github.com/arungudelli/Retract-Go-Module-Versions

          go?1.16

          retract?(
          ????//?Failed?to?update?the?message?DO?NOT?USE
          ????v0.3.0
          ????//?Mistake?happened?in?the?version?DO?NOT?USE
          ????v0.2.0
          )

          增加了版本 3 的變更原因。

          如果需要撤回多個版本,就在 retract 指令中逐行添加模塊版本。

          這次修改的是 hello.go 文件中的信息。

          package?hello

          //?Welcome?Message
          func?Welcome()?string?{
          ????return?"Hello,?gophers?From?Go?1.16?verion"
          }

          使用以下命令發(fā)布新的版本。

          >git?tag?v0.3.1

          >git?push?-q?origin?v0.3.1

          我們的 gopher116.go 通過再次運(yùn)行 go list 命令,就可以查詢到撤回的包。

          >go1.16rc1?list?-m?-u?all

          gopher116
          github.com/arungudelli/Retract-Go-Module-Versions?v0.3.0?(retracted)?[v0.3.1]

          隨后使用 go get 命令將包更新為新版本

          >go1.16rc1?get?github.com/arungudelli/[email protected]

          //go?get:?upgraded?github.com/arungudelli/Retract-Go-Module-Versions?v0.3.0?=>?v0.3.1

          現(xiàn)在終于解決了這個問題。

          >go1.16rc1?run?.

          //Hello,?gophers?From?Go?1.16?version

          安裝最新的且非撤回的 Go Module 版本

          要跟蹤一個 Go 模塊的所有版本是很困難的。

          所以要安裝最新的且非撤回的 Go 模塊版本,請使用 @latest 標(biāo)簽來代替版本。

          >go1.16rc1?get?github.com/arungudelli/Retract-Go-Module-Versions@latest

          go?get:?upgraded?github.com/arungudelli/Retract-Go-Module-Versions?v0.3.0?=>?v0.3.1

          列出所有 Go Module 的版本

          如果需要列出一個 Go 模塊或包的所有版本,請使用go list命令。

          >go1.16rc1?list?-m?-versions?github.com/arungudelli/Retract-Go-Module-Versions

          //OUTPUT
          github.com/arungudelli/Retract-Go-Module-Versions?v0.1.0?v0.3.1

          go list -m -versions 命令不包括撤回的版本。(v0.2.0 和 v0.3.0 不可見)

          列出所有已撤回的 Go Module 版本

          如果需要列出一個 Go 模塊的所有撤回版本,請使用標(biāo)志 -retractedgo list 命令

          >go1.16rc1?list?-m?-versions?-retracted?github.com/arungudelli/Retract-Go-Module-Versions

          //OUTPUT
          github.com/arungudelli/Retract-Go-Module-Versions?v0.1.0?v0.2.0?v0.3.0?v0.3.1

          輸出中包含了已撤回的版本

          安裝撤回的 Go Module 版本

          雖然我們將版本標(biāo)記為撤回,但我們?nèi)匀豢梢韵螺d和使用這些軟件包。

          例如,如果我們嘗試使用 go get 命令安裝已撤回的模塊版本,它將顯示警告信息。

          go1.16rc1?get?github.com/arungudelli/[email protected]
          go:?warning:?github.com/arungudelli/[email protected]:?retracted?by?module?author:?Mistake?happened?in?the?version?DO?NOT?USE
          go:?to?switch?to?the?latest?unretracted?version,?run:
          ????????go?get?github.com/arungudelli/Retract-Go-Module-Versions@latestgo?get:?downgraded?github.com/arungudelli/Retract-Go-Module-Versions?v0.3.1?=>?v0.2.0

          顯示的提示是在 go.mod 文件對應(yīng)的撤回版本上的注釋。

          所以在添加撤回版本的同時,需要給用戶一個有意義的信息。

          你可以下載或者克隆 示例代碼.

          git?clone?https://github.com/arungudelli/Retract-Go-Module-Versions.git

          希望你喜歡這篇文章,如果喜歡請與他人分享。

          ? 如果有疑問可以在?twitter,?facebook,?github?上關(guān)注我,與我取得聯(lián)系。

          瀏覽 125
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  午夜福利一区二区三区 | 日韩一区二区三区在线视频 | 很很干在线视频 | 大鸡吧操小逼 | 中文字幕永久免费 |