Modに移動
GoModパッケージ管理チュートリアル
go 1.11のリリースで、goは依存関係管理の問題を解決するためにgoモジュールを正式に導入し、goモジュールはネイティブのgocmdに統合されました。
ただし、コードベースが$ GOPATHにある場合、go1.11のモジュール機能はデフォルトで有効になっていません。有効にするのは非常に簡単です。環境変数を使用してgoモジュールを有効にできます。
export GO111MODULE=on
GoModとGoPath
現在、モジュールメカニズムはまだ初期段階にあるため、golangは環境変数「GO111MODULE」にデフォルト値のautoを提供します。
現在のディレクトリにgo.modファイルがある場合は、goモジュールを使用します。それ以外の場合は、古いGOPATHとベンダーメカニズムを使用します。これは、go getがモジュールメカニズムの下でgoモジュールのみをダウンロードするためです。この動作は、将来のバージョンでデフォルトになります。 GOPATHから移動せずにモジュールを直接使用する場合は、自動を維持できます。次に、「GO111MODULE」をオンに設定します。
従来のGOPATHとは異なり、モジュールにはsrcやbinなどのサブディレクトリを含める必要はありません。go.modファイルが含まれている限り、ソースコードディレクトリまたは空のディレクトリをモジュールとして使用できます。
$ GOPROXYについて
使用する
goを使用すると、デフォルトでgoは必要な依存関係をコードベースから直接ダウンロードします。環境変数GOPROXYを使用すると、ソースコードをダウンロードする場所を制御できます。
GOPROXYが設定されていない場合、goは依存コードをコードベースから直接ダウンロードします。この環境変数を次のように設定すると、goproxy.ioからすべてのソースコードをダウンロードします。プロキシを設定するコマンドは次のとおりです。
export GOPROXY=https://goproxy.io
この環境変数をブランクにすることでプロキシをオフにできます。コマンドは次のとおりです。
export GOPROXY=
原理
実行前go get golang.org/x/net
に、コードベース、次にネットがローカルGOPATHにgolang.org/x/net
ダウンロードされます。ローカルGOPATHにはすでにバージョンが間違っていても、golangが引用されているため、プロジェクトへの参照はコードベースをダウンロードしません。
しかし、go言語にモジュールの概念が導入されたことで、導入された各モジュールにはバージョンがあります。コードベースの継続的な更新と反復により、同じコードベースを参照している場合でも、異なるタグを使用したり、ハッシュをコミットしたりできます。この現状に基づいて、go1.11モジュールは以前よりも頻繁にソースコードをダウンロードします。
しかし、中国の中国の特徴を備えたインターネットに基づいて、必要な依存ソースコードを取得することが難しい場合があり、プロジェクトのコンパイルの失敗やCIの失敗につながります。したがって、プロキシが必要です。
プロキシ設定
プロキシアドレス
次のように、主に2つのアドレスがあります。
https://goproxy.io
https://athens.azurefd.net
上記の2つのアドレスは、個人の好みに応じて自由に選択できます。
設定方法
ウィンドウズ
$env:GOPROXY = "https://goproxy.io"
Linux
export GOPROXY=https://goproxy.io
Modの使用に行く
goモジュールの初期化
まず、空のプロジェクトフォルダを作成します
E:\Code\gomod
次に、プロジェクトを初期化します。
#Linux
export GO111MODULE=on
export GOPROXY=https://goproxy.io
#Windows
$env:GO111MODULE=on
$env:GOPROXY="https://goproxy.io"
go mod init [module name]
最初の完了後、go.modファイルが1行の「モジュールテスト」のみでディレクトリに生成されます。
パッケージ管理
go build、go test、go listを使用すると、goは自動的にgo.modファイルを更新し、依存関係を書き込みます。依存関係を手動で処理する場合は、次のコマンドを使用します。
go mod tidy
このコマンドは、依存関係を自動的に更新し、パッケージをキャッシュにダウンロードします。
GoModの一般的なコマンド
go.modファイルコマンド
go.modは、次のように、module、require、replace、excludeの4つのコマンドを提供します。
コマンド | 説明 |
---|---|
モジュール | ステートメントは、パッケージの名前(パス)を指定します |
必要とする | ステートメントで指定された依存関係モジュール |
交換 | ステートメントは依存関係モジュールを置き換えることができます |
除外する | ステートメントは依存モジュールを無視できます |
gomodの一般的なコマンド
コマンド | 説明 |
---|---|
ダウンロード | モジュールをローカルキャッシュにダウンロードするには、コマンドgo envを使用して詳細を確認できます。環境変数GOCACHEはキャッシュのアドレスです。フォルダーの内容が大きすぎる場合は、コマンドgo clean-cacheを使用できます。 |
編集 | ツールまたはスクリプトからgo.modファイルを編集します |
グラフ | モジュール需要図を印刷する |
初期化 | 現在のディレクトリで新しいモジュールを初期化します |
きちんと | 不足しているモジュールを追加し、不要なモジュールを削除します |
確認 | 依存関係が意図した目的を達成していることを確認します |
なぜ | パッケージまたはモジュールが必要な理由を説明する |
GoModケース
サードパーティのライブラリを参照する
まず、E:\ Code \ gomodにmain.goファイルを作成し、次のコンテンツを出力します。
package main
import (
"context"
"log"
"time"
"github.com/chromedp/chromedp"
)
func main() {
// create chrome instance
ctx, cancel := chromedp.NewContext(
context.Background(),
chromedp.WithLogf(log.Printf),
)
defer cancel()
// create a timeout
ctx, cancel = context.WithTimeout(ctx, 15*time.Second)
defer cancel()
// navigate to a page, wait for an element, click
var example string
err := chromedp.Run(ctx,
chromedp.Navigate(`https://golang.org/pkg/time/`),
// wait for footer element is visible (ie, page is loaded)
chromedp.WaitVisible(`#footer`),
// find and click "Expand All" link
chromedp.Click(`#pkg-examples > div`, chromedp.NodeVisible),
// retrieve the value of the textarea
chromedp.Value(`#example_After .play .input textarea`, &example),
)
if err != nil {
log.Fatal(err)
}
log.Printf("Go's time.After example:\n%s", example)
}
次に、パッケージのダウンロードを開始し、次のコマンドを入力します。
go mod tidy
次に、go.modとgo.sumの両方がパッケージの依存関係ファイルを増加させることがわかります。これで、直接コンパイルできるようになりました。次のコマンドを入力します。
go build
カスタムライブラリを参照
まず、次のディレクトリを作成します。
E:\Code\wolferserver
E:\Code\wolferserver\base
E:\Code\wolferserver\base\configs
E:\Code\wolferserver\src
E:\Code\wolferserver\src\logicserver
次に、次のファイルを作成します。
E:\Code\wolferserver\base\configs\configs.go
E:\Code\wolferserver\src\logicserver\main.go
各ファイルのファイル内容は次のとおりです。
//configs.go
package configs
import "fmt"
func Demo(){
fmt.Println("Hello Demo")
}
//main.go
package main
import (
"github.com/gin-gonic/gin"
"wolferserver/base/configs"
)
func main(){
logInit()
}
func logInit() {
configs.Demo()
gin.New()
}
最後に、次のコマンドを直接入力してプログラムを実行できます。
go run src/lpgicserver/main.go
バージョン管理
パッケージ管理のもう1つの重要な機能は、パッケージのバージョン制御です。モジュールも同じことができます。
go.sum
github.com/chromedp/cdproto v0.0.0-20190429085128-1aa4f57ff2a9 h1:ARnDd2vEk91rLNra8yk1hF40H8z+1HrD6juNpe7FsI0=
最初の部分はパッケージの名前であり、インポート時に書き込む必要がある部分です。スペースの後のバージョン番号は、「バージョン番号+タイムスタンプ+ハッシュ」に続くバージョン番号です。
自分でバージョンを指定する場合は、バージョン番号を指定するだけで済みます。バージョンタグがない場合は、対応するコミットの時間とハッシュ値を見つける必要があります。デフォルトでは、パッケージの最新バージョンが使用されます。
バージョンを変更する
次に、依存関係を変更する必要があります。次のコマンドだけで、v0.1.0バージョンのchromedpを使用します。
go mod edit -require="github.com/chromedp/[email protected]"
@の後に必要なバージョン番号を追加します。go.modが変更されました。また、モジュールに依存関係を更新させる必要があります。ここでは、手動でmodtidyに移行できます。