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/testmod
がtestmod
の倉庫アドレスです.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は大きく異なります.デフォルトでは、Go
はfetch
倉庫の最新のラベル付きの使用可能なバージョンになります.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)
}
参考記事