Goの依存性の管理


History
~ v1.10
GOPATH内でのみ管理されます.
$GOPATH/srcサブディレクトリでのみプロジェクトを作成できます.
依存性の解決方法
  • 外部パッケージをベンダーディレクトリに保存し、構築に参加します.
  • ドッキングイメージでは、パッケージをGOPATHに格納し、ドッキングイメージとして管理します.
  • v1.11 ~ v1.12
    Goモジュールはオプション機能として登場します.
    ディレクトリが$GOPATH設定のパスにある場合、go.modファイルがあってもモジュールモードでは実行されません.
    モジュールモードを使用するには、GO 111 MODULEという環境変数をONに設定します.
    v1.13 ~
    ディレクトリに移動します.modファイルがある場合は、デフォルトでモジュールモードで実行されます.
    v1.17からGOPATHによる依存管理機能がなくなると言われていますが、まだあるようです.
    でも確かに断られた.
    GOPATH vs Go Module
    複数のプロジェクトを$GOPATH単一パスとして管理すると、各プロジェクトの依存パッケージが混在し、管理が難しくなります.
    Goモジュールでは、プロジェクトごとに依存性を管理できます.
    Go Module
    A module is a collection of Go packages stored in a file tree with a go.mod file at its root.
    最上位ディレクトリに移動します.modファイルを作成すると、ファイルとサブパッケージを含むモジュールになります.
  • go.modの位置はmodule rootです.
  • Goモジュールのプロジェクトディレクトリは$GOPATH/srcの外にあり、go.modまたはgoが含まれます.modが存在するディレクトリのサブパスです.
  • 外部モジュールのバージョンの管理
    外部モジュールパスとバージョンgo.modファイルに書き込みます.外部モジュールを再構成する必要がある場合は、そのバージョンにモジュールをダウンロードします.
  • goインジケータは省略し、goコマンドはgoです.modを更新できない場合はv 1です.11とします.
  • goインジケータはv 1です.12から自動追加
  • go.modやgoはありませんmodにgoインジケータが省略されている場合、v 1.16と見なす.
  • GOPATHモードで開発したgo.modは存在しない可能性があります.
  • vendor/modules.txtはv 1です.17も行きますmodのgoバージョンは記録されません.
  • module sample
    go 1.13
    require (
    	github.com/aliyun/aliyun-oss-go-sdk v2.0.5+incompatible
    	github.com/artdarek/go-unzip v0.0.0-20180315101617-33dc05190e4b
    	github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496
    	github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
    	github.com/extrame/ole2 v0.0.0-20160812065207-d69429661ad7 // indirect
    	github.com/go-sql-driver/mysql v1.5.0
    	github.com/go-xorm/xorm v0.7.9
    	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
    	github.com/labstack/echo v3.3.10+incompatible
    	github.com/pangpanglabs/echoswagger v1.1.0
    	github.com/pangpanglabs/goutils v0.0.0-20200116103626-3f9fcfaa29b0
    	github.com/sergeilem/xls v0.0.1
    	github.com/tealeg/xlsx v1.0.5
    	github.com/urfave/cli v1.22.2
    	golang.org/x/image v0.0.0-20200119044424-58c23975cae1
    )
    命令語
    go mod init [path]
    go.modを作成します.pathにアイテムのパッケージ名を入力します.
    pathはgithubにアップロードしてモジュールとして使用する場合githubです.com/アカウント名/プロジェクト名の形式なので、最初からこの形式で書くことをお勧めします.
    go get [path]
    pathにパケットアドレスを入力して外部パケットをダウンロードします.この時に行きます.modを同時に書き込む.
    go mod vendor
    依存パッケージを$GOPATHパスからプロジェクトパスにコピーします.
    go run -mod vendor main.go
    コピーされたパッケージでは、ローカルベンダーパスのパッケージを使用できます.(Pythonのvenvのように)
    go get動作方式
    Goモジュールを無効にする
  • import pathを表示し、どのvcsを使用するかを決定します.
  • vcsのモードに従ってパッケージをダウンロードします.
  • github.comで始まるgithub.com管理とgit vcsを使用すると判断し、https://とgit+ssh://モード順にダウンロードしてみます.
  • Goモジュール使用時
  • https://proxy.golang.org(公式エージェントサーバ、設定に応じて変更可能)でミラーモジュールを検索します.
  • ない場合は、直接検索します.(リポジトリに直接アクセス)
  • モジュールが見つかった場合は、ダウンロードして移動します.sumに対してチェックサムを実行します.
  • チェックサムhttps://sum.golang.org(正式チェックサムDBサーバでは設定により変更される場合があります)チェックサム値を取得します.
  • go.sumを更新します.
  • go.sumは、改ざんの有無を確認するために、各デジタルコピーのチェックサムを記録する.
  • 最初にダウンロードされたモジュールと後にダウンロードされたモジュールが同じビットを持っているかどうかを確認し、様々な理由でプロジェクトに依存するモジュールが予期せぬ変形を起こさないようにします.
  • バージョン管理時gomodとgo両方とも載せましょう
    かんきょうへんすう
  • GO111MODULE=[on | off | auto]
  • Goモジュールを使用するかどうかを指定します.
  • GOPROXY=[proxy server url]
  • Moduleモードで外部モジュールをダウンロードする場合は、を参照してください.
  • GOSUMDB=[sum db server url]
  • Moduleモードでのチェックサムの場合は、を参照してください.
  • GONOPROXY=[directory]
  • エージェントの使用から除外するパスのリスト.
  • GONOSUMDB=[directory]
  • チェックサムから除外するパスのリスト.
  • GOPRIVATE=[directory]
  • エージェントとチェックサムから除外するパスのリスト.
  • 参考資料
  • https://velog.io/@you1367/Go-Path-vs-Go-Module
  • https://www.popit.kr/%EA%B3%A0-%EB%AA%A8%EB%93%88%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%84%B1-%EB%B0%A9%EB%B2%95-%EA%B0%9C%EC%84%A0%ED%95%98%EA%B8%B0/
  • https://mingrammer.com/go-modules-private-repo/
  • https://johngrib.github.io/wiki/commit-go-mod-go-sum/