<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 如何基于 MVS 解決依賴關系問題

          共 2718字,需瀏覽 6分鐘

           ·

          2024-06-28 22:21

          摘要:文章主要介紹了 Go 如何解決依賴關系和版本沖突問題,以及模塊管理系統(tǒng),包括 go.mod 文件的作用、go get 和 go install 命令的使用

          Go 使用一種名為 "最小版本選擇(Minimal version selection)"(MVS[1])的方法來處理依賴關系和解決版本沖突。MVS 聽起來很復雜,但要點如下:它為每個模塊挑選最低版本,以滿足其他模塊的所有要求。這樣,它就能在滿足所有相關需求的同時,盡可能減少依賴性。

          例如,假設我們有三個模塊:A、B 和 C。

          模塊 [email protected] 和模塊 [email protected] 都依賴于模塊 C。

          但 A 需要 [email protected],B 需要 [email protected]。

          同時 C 也有一個更新的版本,即 2.4.1。

          Go 如何決定使用哪個版本的 C?

          如果選擇的 2.3.2 版本與模塊 B 不兼容怎么辦?

          Go 模塊使用語義版本控制(semver[2])來處理兼容性問題。如果模塊遵循 semver,則任何破壞性修改都應修改主版本(major.minor.patch)。由于 2.3.0 和 2.3.2 兩個版本的主要版本(2.3.x)相同,因此它們應該相互向后兼容。模塊作者有責任確保不同版本保持兼容。

          如果 A 需要 3.0.0 版本的 C,這會破壞與 B 的兼容性,怎么辦?

          當模塊達到主版本 2 或更高版本時,其路徑會包含主版本號(如 /v2 或 /v3):

          github.com/user/project/v2
          github.com/user/project/v3

          不同主要版本的模塊被視為不同的模塊。因此,我們可以在同一項目中同時使用 [email protected][email protected]

          例如,我們的 go.mod 文件可能如下所示:

          module yourproject

          require (
              github.com/user/A v1.0.0
              github.com/user/B v1.0.0
          )
          require (
              github.com/user/C/v2 v2.3.2 // indirect
              github.com/user/C/v3 v3.0.0 // indirect
          )

          // indirect 注釋表示這里的項目沒有直接導入 C 模塊,而是因為 A 或 B 需要它才導入的。

          還有一個要注意點:go get 不會更新或添加缺失的測試依賴項。要包含這些依賴項,請使用 -t 標志,如 go get -t ./...

          go get

          這里舉幾個例子,看看 go get 在不同情況下是如何工作的。

          使用 go get .或 go get ./...查找當前目錄或其子目錄中所有缺失的依賴項,并將其添加到 go.mod 文件中。這意味著它會檢查任何尚未列出的依賴項,并將其添加進來。除非你特別要求,否則它不會將現(xiàn)有的依賴項更新到最新版本,比如下一個例子中的 -u 標志。

          go get -u .

          在 go get .中使用 -u 標志,會將當前目錄中的現(xiàn)有依賴項更新到最新的次版本或補丁版本。請記住,它不會更新到新的主版本,因為它們被視為不同的模塊。要將主模塊的所有依賴項更新到最新版本,可以使用 go get -u ./...

          在下面的幾個情況下,即使不指定 -u 標志,go get 仍會更新過時或丟失的依賴項。

          go get github.com/user/project

          此命令下載模塊 github.com/user/project,并將其添加到 go.mod 文件中。如果該模塊已列在該文件中,則會將其更新為最新的次版本或補丁版本。基本上,如果你不指定版本(或版本查詢后綴),它會假定你想升級到最新版本,就像使用 go get github.com/user/project@upgrade 一樣。

          go get github.com/user/[email protected]

          此命令將模塊更新到指定版本,即 v1.2.3。根據(jù)當前的版本,它可能會升級或降級模塊以匹配該版本。

          go install: build and install packages

          與下載依賴項以便在項目中使用其源代碼不同,go install 會將依賴項的源代碼編譯成二進制文件,并將其移動到 $GOPATH/bin 目錄中進行安裝。這樣就可以在終端上使用它了。

          例如:

          $ go install golang.org/x/tools/gopls@latest

          運行該命令并查看 GOBIN 在您的 $PATH 中,您就可以在終端中運行 gopls。

          如果只是在沒有任何參數(shù)的情況下運行 go install 會怎樣呢?go install 就會下載缺失的依賴項,并在當前目錄下構建當前模塊。這導致一些人誤用 go install 來管理依賴關系,因為它確實會下載依賴關系。但這并不是它的主要工作,它實際上是要構建你的項目,并將生成的二進制文件安裝到 $GOBIN 目錄中。

          go install 用于構建和安裝軟件包,而 go get 用于管理依賴關系。有些開發(fā)者經常會感到困惑,這是因為在舊版本的 Go 中,go get 確實是用來在更新 go.mod 文件后構建軟件包,然后將它們安裝到 $GOPATH/bin。

          但從 Go 1.16 開始,go install 成為了構建和安裝的首選命令,而 go get 則專注于管理 go.mod 文件中的需求。

          參考資料
          [1]

          MVS: https://go.dev/ref/mod#minimal-version-selection

          [2]

          semver: https://semver.org/


          瀏覽 83
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  午夜黄色视频在线观看 | 五月丁香福利 | 丁香婷婷五月基地 | 亚洲狼人天堂 | 91成人在线视频 |