Go Modulesの詳細

14408 ワード

modulesは、Go 1.11バージョンで提案された依存パッケージ管理システムである.
自分でmoduleを作成する方法
前にGo 1.1.1新機能moduleの紹介と使用文ではmodule機能を紹介し、他の人が作成したmoduleをどのように使用するかを紹介しています.この節では、moduleを自分で作成して他の人に使用させる方法を見てみましょう.
  • は、testmodという名前のパッケージを最初に作成します.ただし、testmodディレクトリは$GOPATHディレクトリの外にある必要があります.デフォルトでは、$GOPATHディレクトリのmodule機能は使用できません.
  • はその後、testmodディレクトリに入り、簡単なtestmod.goファイルを作成します.
  • package testmod
    
    import "fmt"
    
    // SayHello returns a friendly greeting
    func SayHello(name string) string {
        return fmt.Sprintf("Hello, %s", name)
    }
    

    現在、testmodパックはmoduleとは言えませんが、今から変更します.コマンドラインでは、github倉庫があるか、コードを保存できる倉庫があることを前提に、次のgoコマンドのgithub.com/benben2015/testmodtestmodの倉庫アドレスです.
    go mod init github.com/benben2015/testmod
    
    # go: creating new go.mod: module github.com/benben2015/testmod
    
    testmodディレクトリの下にgo.modのファイルが作成されます.内容は次のとおりです.
    module github.com/benben2015/testmod
    

    これにより、testmodパッケージをmoduleに変更し、コードpushをリモートウェアハウスに転送します.これにより、他の人はgo getコマンドを使用して使用することができます.
    git push -u origin master
    

    他の人がmoduleをどう使うかGo modulesのバージョン管理は意味化されたバージョンに従い、特にGoは倉庫のラベルを使用してバージョンを検索することに重点を置いています.たとえば、バージョン2はバージョン1と大きく異なるはずです.バージョン0は大きく異なります.デフォルトでは、Gofetch倉庫の最新のラベル付きの使用可能なバージョンになります.
    Moduleのバージョン管理git tagコマンドを使用して、1.0.0バージョンをリリースします.
    git tag v1.0.0
    git push --tags
    

    上記のコマンドは、ウェアハウスの現在のコードにtagを作成し、私たちのバージョン1.0.0とします.Goは、プライマリ・バージョンのいくつかの修復バージョンをパブリッシュするために新しいブランチを強制的に作成していませんが、これを推奨します.
    git checkout -b v1
    git push -u origin v1
    

    moduleの使用
    これで、以前に作成したmoduleを使用して、プロジェクトを新規作成し、main.goファイルを作成できます.
    package main
    
    import (
        "fmt"
    
        "github.com/benben2015/testmod"
    )
    
    func main() {
        fmt.Println(testmod.SayHello("China"))
    }
    
    module機能がない前に、上記のパッケージを使用する可能性がある場合は、go get github.com/benben2015/testmodコマンドでパッケージをダウンロードする必要があります.しかしmodulesを使うと、そんなに面倒ではありません.
    まず、プログラムでmodules機能を使用可能にし、コマンドgo mod init modを使用する必要があります.実行が完了すると、次の内容の新しいファイルgo.modが作成されます.
    module mod
    

    コンストラクションコマンドを実行すると、Goコマンドがプログラムにインポートされたパッケージを自動的に引き出します.
    go build
    
    go: finding github.com/benben2015/testmod v1.0.0
    go: downloading github.com/benben2015/testmod v1.0.0
    
    go.modのファイルをチェックすると、変更が表示されます.
    module mod
    require github.com/benben2015/testmod v1.0.0
    

    また、パケットに依存するgo.sumの値を含む新しいファイルhashも表示され、正しいバージョンとファイルを確保することができます.
    github.com/benben2015/testmod v1.0.0 h1:kiEBYKHX5VR04NwYHo4QTZfd5F6nkeCpvDi5tr5UuBo=
    github.com/benben2015/testmod v1.0.0/go.mod h1:nJ45ppreUJfCWss5GtOwRC5FVfGv0p0ii1rrh7Sqdi0=
    

    バグ修正バージョンの作成
    バージョンに小さな変更がある場合は、通常、プライマリ・バージョン番号は変更されず、セカンダリ・バージョンのみが変更されます.たとえば、以前に作成したtestmodモジュールは、
    func SayHello(name string) string {
        return fmt.Sprintf("Hi, %s!", name)
    }
    

    その後、ラベルを再構築し、pushをリモート・ウェアハウスに移動します.
    git tag v1.0.1
    git push --tags origin master
    

    使用するmodulesの更新
    デフォルトでは、Goはmodulesを自発的に更新しません.コマンドgo getを使用してGoに更新するように伝える必要があります.
  • go get -uを実行し、依存パッケージの最新バージョンを使用します.例えば1.0を更新.0~1.0.1または1.1.0.
  • 実行go get -u=patchは、依存パッケージのバージョンを最新のリビジョンに更新します.例えば1.0を更新.0~1.0.1.
  • go get package@versionを実行すると、依存パッケージのバージョンが特定のバージョンに更新されます.

  • したがって、go get -uを実行すると、go.modのファイルは
    module mod
    require github.com/benben2015/testmod v1.0.1
    

    マスターバージョンの作成
    バージョンが大きく更新されると、プライマリ・バージョン番号が変わります.Go modulesは、マスターバージョン番号が異なるmodulesが全く異なるパッケージであると考えている.たとえば、testmodパッケージのファイルを次のように変更します.
    package testmod
    
    import (
        "errors"
        "fmt"
    )
    
    // SayHello returns a friendly greeting in language lang
    func SayHello(name, lang string) (string, error) {
     	switch lang {
     	case "en":
     		return fmt.Sprintf("Hi, %s!", name), nil
     	case "pt":
     		return fmt.Sprintf("Oi, %s!", name), nil
     	case "es":
     		return fmt.Sprintf("¡Hola, %s!", name), nil
     	case "fr":
     		return fmt.Sprintf("Bonjour, %s!", name), nil
     	default:
     		return "", errors.New("unknown language")
     	}
    }
    

    バージョン2インポートパスを変更し、go.modファイルに新しいバージョンパスmodule github.com/benben2015/testmod/v2を追加します.その後、以前と同様にラベルを追加し、push.
    git tag v2.0.0
    git push --tags origin v2
    

    プライマリ・バージョンの更新
    前述したように、バージョンgo get -uは、v1.0.1を使用して2.0.0に更新されません.では、どうすればいいでしょうか.まず、プログラムを次のように変更します.
    package main
    
    import (
        "fmt"
        "github.com/benben2015/testmod/v2"
    )
    
    func main() {
        g, err := testmod.SayHello("China", "pt")
        if err != nil {
            panic(err)
        }
        fmt.Println(g)
    }
    

    その後、go buildコマンドを使用して構築され、Goは2.0.0のバージョンを引き出します.注意:私たちのインポートパスの後ろにv 2がありますが、Goはモジュールを使用するときにtestmodを使用します.
    前述したように、プライマリ・バージョン番号が異なり、Goは異なるパッケージと考えているので、互換性のないバージョンを同じファイルで参照することができます.
    package main
    
    import (
        "fmt"
        "github.com/benben2015/testmod"
        testmodML "github.com/benben2015/testmod/v2"
    )
    
    func main() {
        fmt.Println(testmod.SayHello("China"))
        g, err := testmodML.SayHello("China", "pt")
        if err != nil {
            panic(err)
        }
        fmt.Println(g)
    }
    

    参考記事
  • Introduction to Go Modules