ホーム プログラミング言語 golang go package Go 言語での go mod パッケージの依存関係管理ツールの使用方法の詳細な説明

Go 言語での go mod パッケージの依存関係管理ツールの使用方法の詳細な説明

Go 言語での go mod パッケージの依存関係管理ツールの使用方法の詳細な説明

 
 
初期の頃、Go 言語が依存するすべてのサードパーティ ライブラリは GOPATH ディレクトリの下に配置されていたため、同じライブラリには 1 つのバージョンのコードしか保存されませんでした。異なるプロジェクトが同じサードパーティ ライブラリの異なるバージョンに依存している場合はどうすればよいですか?

 

go module は Go 言語のバージョン 1.11 以降の公式バージョン管理ツールであり、Go のバージョン 1.13 からは go module が Go 言語のデフォルトの依存関係管理ツールになりました。

モジュールの正式な定義は次のとおりです。

モジュールは関連する Go パッケージのコレクションであり、ソース コード交換とバージョン管理の単位です。 Go 言語コマンドは、他のモジュールへの依存関係の記録と解決を含む、モジュールの使用を直接サポートしており、モジュールは、使用するソース ファイルを指定する古い GOPATH ベースのメソッドを置き換えます。

モジュールの使用方法?

1) まず、golang をバージョン 1.11 以降にアップグレードする必要があります (現在 1.13 がリリースされているため、1.13 を使用することをお勧めします)。

2) GO111MODULEを設定します。

GO111モジュール

Go 言語のバージョン 1.12 より前では、go モジュール ツールを有効にするには、まず環境変数 GO111MODULE を設定する必要がありましたが、Go 言語のバージョン 1.13 以降では、環境変数を設定する必要はなくなりました。 go module ツールは、GO111MODULE を通じてオンまたはオフにできます。

  • GO111MODULE=off は go モジュールを無効にし、コンパイル時に GOPATH およびベンダー フォルダーからパッケージを検索します。
  • GO111MODULE=on go モジュールを有効にすると、コンパイル時に GOPATH とベンダー フォルダーが無視され、go.mod に従って依存関係のみがダウンロードされます。
  • GO111MODULE=auto (デフォルト値)、プロジェクトが GOPATH/src ディレクトリの外にあり、プロジェクトのルート ディレクトリに go.mod ファイルがある場合、go モジュールを開きます。

Windows で GO111MODULE を開くコマンドは次のとおりです。

set GO111MODULE=on 或者 set GO111MODULE=auto

MacOS または Linux で GO111MODULE を開くコマンドは次のとおりです。

export GO111MODULE=on 或者 export GO111MODULE=auto

GO111MODULE を有効にすると、go module ツールを使用できるようになります。つまり、今後の開発で GOPATH にプロジェクトを作成する必要がなく、プロジェクトが依存するサードパーティのパッケージ情報も管理できます。

一般的に使用されるgo modコマンドを次の表に示します。

注文 効果
go mod download 依存パッケージをローカルにダウンロードします (デフォルトは GOPATH/pkg/mod ディレクトリです)。
go mod edit go.mod ファイルを編集する
go mod grap 印刷モジュールの依存関係グラフ
go mod init 現在のフォルダーを初期化し、go.mod ファイルを作成します。
go mod tidy 不足しているパッケージの追加、不要なパッケージの削除
go mod vendor 依存関係をベンダー ディレクトリにコピーします
go mod verify 依存関係をチェックする
go mod why なぜ依存する必要があるのか​​説明する

ゴプロキシ

プロキシとはその名の通りプロキシサーバーのことです。国内ネットワークにはファイアウォールがあり、 go getコマンドを使用して Go 言語の一部のサードパーティ パッケージを直接取得できないことは誰もが知っています。 GOPROXY は、Go 言語によって公式に提供され、中間エージェントを通じてユーザーにパッケージ ダウンロード サービスを提供する方法です。 GOPROXY を使用するには、環境変数 GOPROXY を設定するだけです。

現在パブリック プロキシ サーバーのアドレスは次のとおりです。

  • goproxy.io;

Go 言語のバージョン 1.13 以降、GOPROXY のデフォルト値は https://proxy.golang.org です。

go get コマンドを使用して、依存パッケージの指定されたバージョンをダウンロードします。

go getコマンドを実行すると、依存パッケージをダウンロードするときに依存パッケージのバージョンを指定することもできます。

  • go get -uコマンドを実行すると、プロジェクト内のパッケージが最新のマイナー バージョンまたはリビジョンにアップグレードされます。
  • go get -u=patchコマンドを実行すると、プロジェクト内のパッケージが最新リビジョンにアップグレードされます。
  • go get [包名]@[版本号]コマンドを実行すると、対応するパッケージの指定されたバージョンがダウンロードされるか、対応するパッケージが指定されたバージョンにアップグレードされます。

ヒント: コマンドgo get [包名]@[版本号]バージョン番号は、go get foo@v1.2.3 などの xyz の形式、または go get foo などの git 上のブランチまたはタグの形式にすることができます。 @master、または git コミット ハッシュを指定できます (例: go get foo@e3702bed2)。

プロジェクトでの使い方

【例1】新規プロジェクトを作成する:

1) GOPATH ディレクトリの外に新しいディレクトリを作成し、 go mod initを使用して初期化して go.mod ファイルを生成します。

go mod init hello
go: creating new go.mod: module hello

go.mod ファイルが作成されると、その内容は go toolschain によって完全に制御され、 go getgo buildgo modなどのさまざまなコマンドが実行されるときに go toolchain が go.mod ファイルを変更および維持します。

go.mod は、require、replace、exclude という 4 つのコマンド モジュールを提供します。

  • module ステートメントは、パッケージの名前 (パス) を指定します。
  • require ステートメントで指定された依存関係モジュール。
  • replace ステートメントは依存関係モジュールを置き換えることができます。
  • exclude ステートメントは依存モジュールを無視できます。

初期化によって生成される go.mod ファイルは次のとおりです。

module hello

go 1.13

2) 依存関係を追加します。

新しい main.go ファイルを作成し、次のコードを記述します。

package main

import (
    "net/http"
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "こんにちは、世界!")
    })
    e.Logger.Fatal(e.Start(":1323"))
} 

go run main.goを実行してコードを実行すると、go mod が自動的に依存関係を見つけてダウンロードすることがわかります。

go run main.go
go: finding github.com/labstack/echo v3.3.10+incompatible
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: extracting github.com/labstack/echo v3.3.10+incompatible
go: finding github.com/labstack/gommon v0.3.0
……
go: finding golang.org/x/text v0.3.0

   ____    __
  / __/___/ /  ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                                      O\
⇨ http server started on [::]:1323

go.mod のコンテンツを表示します。

module hello

go 1.13

require (
    github.com/labstack/echo v3.3.10+incompatible // indirect
    github.com/labstack/gommon v0.3.0 // indirect
    golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 // indirect
)

go モジュールのインストール パッケージの原則は、最初に最新のリリース タグをプルし、タグがない場合は最新のコミットをプルすることです (詳細はモジュールの公式紹介を参照してください)。

go は、依存関係ツリーを記録する go.sum ファイルを自動的に生成します。

github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
… 省略很多行

スクリプトgo run main.goを再度実行すると、依存関係の確認とインストールの手順がスキップされていることがわかります。

コマンドgo list -m -u allを使用して、アップグレードできるパッケージを確認できます。 go get -u need-upgrade-packageでアップグレードした後、新しい依存関係バージョンは go.mod に更新されます * を使用することもできますgo get -uてすべてをアップグレードします。

【事例2】既存プロジェクトを改修する。

プロジェクトのディレクトリ構造は次のとおりです。

├─ main.go

└─ api
      └─ apis.go

main.go のソースコードは次のとおりです。

package main

import (
    api "./api"  // ここでは相対パスを使用しています
    "github.com/labstack/echo"
)
func main() {
    e := echo.New()
    e.GET("/", api.HelloWorld)
    e.Logger.Fatal(e.Start(":1323"))
} 

api/apis.go のソースコードは次のとおりです。

package api

import(
    "net/http"

    "github.com/labstack/echo"
)

func HelloWorld(c echo.Context) error {
    return c.JSON(http.StatusOK, "hello world")
} 

1) go mod init ***を使用して go.mod を初期化します。

go mod init hello
go: creating new go.mod: module hello

2) go run main.go

go run main.go
go: finding golang.org/x/crypto latest
build _/D_/code/src/api: cannot find module for path _/D_/code/src/api

まず、インストールの依存関係を検索してダウンロードし、スクリプト main.go を実行すると、エラーがスローされます。

build _/D_/code/src/api: cannot find module for path _/D_/code/src/api

ただし、go.mod は更新されました。

module hello

go 1.13

require (
    github.com/labstack/echo v3.3.10+incompatible // indirect
    github.com/labstack/gommon v0.3.0 // indirect
    golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 // indirect
)

では、なぜこのエラーがスローされるのでしょうか?

これは、main.go の内部パッケージの使用方法が以前と異なり、go.mod が同じ作業ディレクトリ内のすべてのパッケージをスキャンしてインポート方法を変更するため、パスのプレフィックスとして hello を使用する必要があるためです。 、 import hello/ api として記述する必要があります。以前の GOPATH/dep モードで許可されていた import ./api の有効期限が切れています。

3) 古いパッケージのインポート方法を更新します。

したがって、main.go を次のように書き直す必要があります。

package main

import (
    api "hello/api" // ここでは相対パスを使用しています
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", api.HelloWorld)
    e.Logger.Fatal(e.Start(":1323"))
} 

ヒント: Go 言語バージョン 1.11 で go mod を使用すると、 go build github.com/valyala/fasttemplate: module require go 1.12 などのエラーが発生する可能性があります。1.12 にアップグレードする必要がある同様の問題が発生した場合は、直接アップグレードできます。 to Go 言語バージョン 1.12 以降で問題ありません。

4) ここでは、新しいプロジェクトを作成するのと変わりません。

直接取得できないパッケージを置換するには、replace を使用します。

いくつかの既知の理由により、golang.org のパッケージなど、すべてのパッケージを正常にダウンロードできるわけではありません。

go.mod ファイルで replace コマンドを使用すると、モジュールを github 上の対応するライブラリに置き換えることができます。例:

replace (
    golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
)

また

replace golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a

 

「 Go 言語での go mod パッケージの依存関係管理ツールの使用方法の詳細な説明」についてわかりやすく解説!絶対に観るべきベスト2動画

Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】
Golang学习记03,Go Modules包管理 (go mod项目管理)
Share via
Copy link