1つの記事でGoModを理解する

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に移行できます。

ハイコーダー(www.haicoder.net)

おすすめ

転載: blog.csdn.net/weixin_41384860/article/details/109407708