モジュールでのパッケージ管理
最初に go.mod を変更する go mod edit を導入しましたが、それには 2 つの要素があります。欠陥:
1. まず、-require は「package@version」の形式を受け入れる必要があり、これは必須であり、ドキュメント内で指定されているマスター フラグと最新フラグを認識できません。
2. 次に、編集は依存関係のバージョンの変更、パッケージの名前変更、特定のパッケージのブロックにのみ適しており、依存関係の追加には適していません。
良いニュースは、go get にモジュール内のパッケージを追加/変更/更新できる機能があることです。
Go モジュールを完全に体験するには、GOPATH 以外のディレクトリを選択し、GO11MODULE=on に設定する必要があります。このようにして、go get を使用しても現在のメイン モジュールにのみ影響し、GOPATH を汚染することはありません。
プロジェクトを非 GOPATH パスに複製し、
go mod init [project name]
を使用してモジュールを初期化します。初期化されたディレクトリ:
現時点では go.mod はまだ空です。go build によって go.mod が更新されることがわかっているので、最初に build を実行します
デフォルトでは、最新のパッケージを取得するために go get が使用されます。これで go.mod が更新され、プロジェクトが正常にコンパイルされました。これが go.mod の意味です:
module schanclient require ( github.com/PuerkitoBio/goquery v1.4.1 github.com/andybalholm/cascadia v1.0.0 // indirect github.com/chromedp/chromedp v0.1.2 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d // indirect )
indirect このパッケージはサブモジュール/パッケージに依存していますが、メインモジュールは直接インポートされて使用されていない、いわゆる間接参照であることを意味します。
通常、go.mod はデフォルトの動作を使用してパッケージ管理を適切に完了できますが、人生には常にいくつかの例外があります。
chromedp がバージョン 0.1.2 を使用していることがわかります。これは 3 か月前のバージョンです。最新のコミットは先月でした。Go mod edit では、バージョン番号またはコミット時のチェックサムを明確に指定する必要があります。明らかにこれは面倒です。そして私たちが望むものではありません。
では、最新のタグの代わりに最新バージョンを使用するにはどうすればよいでしょうか?
それとも、最新バージョンは必要なく、特定のバージョンのパッケージが必要なのでしょうか?
これはバージョン選択の内容です。
go get の新機能 - バージョン選択
以前は gopkg.in go get のようなソリューションがありましたが、新しい go get でサポートされるバージョン選択は、このソリューションをさらに拡張したものです。いくつかのルールを見てください:
go get は、パッケージを自動的にダウンロードしてインストールし、それを go.mod に更新します
go get package[@version] を使用して、指定されたバージョンのパッケージをインストールします。バージョンが指定されていない場合、デフォルトの動作は go get package@latest
version と同じです。vx の形式にすることができます。 .y.z またはコミット チェックサムを直接使用するか、マスターまたは最新
バージョンが最新の場合、それがデフォルトの動作です。タグ付きのパッケージの場合は、最新のタグが選択されます。タグのないパッケージの場合は、最新のコミット
## が選択されます。#バージョンがマスターの場合、パッケージがタグ付けされているかどうかに関係なく、マスター ブランチの最新のコミットが選択されます。#>、> を使用できます。選択したバージョンを示すために、バージョンの前に ;=、
go get -u はパッケージを更新できます最新バージョンへの
go get -u=patch は、マイナー バージョンのみを更新します (たとえば、v1.2.4 から v1.2.5
パッケージ バージョンを変更する場合は、 package@specified version を取得するだけで済みます。
その場合、代わりに chromedp を使用します。最新バージョンは非常にシンプルです:
go get github.com/chromedp/chromedp@master
現在、chromedp は go.mod で更新されています:
module schanclient require ( github.com/PuerkitoBio/goquery v1.4.1 github.com/andybalholm/cascadia v1.0.0 // indirect github.com/chromedp/chromedp v0.1.3-0.20180717231922-bf52fed0d3e6 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d // indirect )
ここでさらにパッケージを追加したい場合はどうすればよいでしょうか?
go get を直接使用してください。たとえば、gorm を使用してデータを保存したいとします:
go get github.com/jinzhu/gorm
更新された go.mod
module schanclient require ( github.com/PuerkitoBio/goquery v1.4.1 github.com/andybalholm/cascadia v1.0.0 // indirect github.com/chromedp/chromedp v0.1.3-0.20180717231922-bf52fed0d3e6 github.com/jinzhu/gorm v1.9.1 // indirect github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect golang.org/x/net v0.0.0-20180826012351-8a410e7b638d // indirect )
最新バージョンが表示されます。が追加されました。もちろん、メインモジュールにインポートしていないため、間接的です。
v1.9 gorm を使用したい場合:
go get github.com/jinzhu/gorm@v1.9
残念ながら、バージョンの選択はメジャー バージョンからマイナー バージョンまでです。v1.9 と v1.9.1 がある場合は、 v1.9 を指定すると、v1.9 以外に v1.9.z タグがない限り、マイナー バージョン番号が最も大きいバージョンが自動的に選択されます (この場合は v1.9.1)。
言及する価値のあるもう 1 つの点は、go build と go test は go.mod にないパッケージのみを追加し、go get によって導入されたルールを上書きしたり変更したりしないため、それらについて心配する必要はないということです。矛盾している。
これは venv pip に似ていると思いますか? はい、これは go のパッケージ管理ツールが徐々に最新になっていることを示しています。
パッケージのブロック、パッケージの削除、およびパッケージの名前変更 (golang.org/x/... でアクセスできないパッケージなど) については、これらは go mod edit の機能です。詳細については go help mod を参照してください。編集 。
推奨:
go 言語チュートリアル以上がgo モジュールでのパッケージ管理のための go get の使用の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。