モジュール(Modules) - Golang learning step 2-12
- 公開日
- カテゴリ:GoingDeeper
- タグ:Golang,roadmap.sh,学習メモ
roadmap.sh > Go > Going Deeper > Modules の学習を進めていきます。
※ 学習メモとしての記録ですが、後にこのセクションを学ぶ道しるべとなるよう、ですます調で記載しています。
contents
開発環境
- チップ: Apple M2 Pro
- OS: macOS Sonoma
- go version: go1.23.2 darwin/arm64
参考 URL
モジュール(Modules)
モジュールは、Go のコードをまとめた単位で、依存関係を記述する go.mod ファイルによって管理されます。モジュールを使用することで、プロジェクトの依存パッケージやそのバージョンを正確に追跡し、他の開発者と環境を共有できます。
モジュールの基本要素
1. go.mod ファイル
go.mod はモジュールのルートに存在し、以下の情報を管理します。
- モジュール名(通常はリポジトリのパス)
- Go のバージョン
- 依存するパッケージとそのバージョン
module example.com/my-module
go 1.23
require (
github.com/gin-gonic/gin v1.9.0
golang.org/x/tools v0.7.0
)
2. go.sum ファイル
go.sum は依存パッケージの正確なバージョンとハッシュを記録します。これにより、依存関係の整合性が保証されるだけでなく、改ざんされたパッケージの検出にも役立ちます。
github.com/gin-gonic/gin v1.9.0 h1:abc123...
github.com/gin-gonic/gin v1.9.0/go.mod h1:def456...
モジュールを利用する基本的なコマンド
1. モジュールの初期化
モジュールを新規作成するには、go mod init
を使用します。
go mod init example.com/my-module
2. 依存関係の追加
新しいパッケージをインストールする際は、go get
を使います。
# 最新バージョンを追加
go get github.com/gin-gonic/gin
# 特定のバージョンを指定
go get github.com/gin-gonic/gin@v1.9.0
# メジャーバージョンの最新を指定
go get github.com/gin-gonic/gin@v1
実行後、go.mod と go.sum が更新されます。
3. 依存関係の整理
依存関係を整理し、不要なパッケージを削除するには、go mod tidy を使用します。
go mod tidy
4. モジュールのアップデート
特定のパッケージを最新バージョンに更新するには、go get
を使います。
go get github.com/gin-gonic/gin@latest
モジュールのメリット
- 依存関係の管理が容易
- パッケージとそのバージョンを go.mod で一元管理。
- 再現性の高いビルド
- go.sum による正確なバージョン管理で、異なる環境でも同じ依存関係を再現可能。
- 不要なパッケージの自動削除
go get
やgo mod tidy
によって不要なパッケージを整理。
- バージョン管理システムからの独立性
- モジュールパス(例: example.com/my-module)を使用することで、GitHub 以外のホスティングサービス(例: GitLab)に移動しても、一貫して依存関係を参照できます。
注意点
- Go 1.16 以降では、モジュールモードがデフォルトになっており、すべてのプロジェクトがモジュールとして扱われます。
- モジュールを使わずに従来の
GOPATH
モードで開発することは推奨されません。 - プライベートモジュールを使用する場合は、
GOPRIVATE
環境変数の設定が必要になることがあります。
プライベートモジュール
プライベートモジュールは、パブリックにアクセスできないリポジトリ(社内 GitLab やプライベートな GitHub リポジトリなど)にホストされているGoモジュールのことです。以下のような場合に使用されます。
- 企業の内部ライブラリ
- 非公開のプロジェクトで共有されるコード
- 有料または制限付きの配布が必要なモジュール
プライベートモジュールの使用例
1. モジュールの宣言
module gitlab.mycompany.com/team/project
go 1.21
require (
gitlab.mycompany.com/internal/logger v1.2.0
github.com/mycompany/private-lib v0.1.0
)
2. プライベートモジュールのインポート
package main
import (
"gitlab.mycompany.com/internal/logger" // 社内のプライベートモジュール
"github.com/mycompany/private-lib/utils" // 外部のプライベートモジュール
)
func main() {
logger.Init()
utils.DoSomething()
}
まとめ
- Go のモジュールは依存関係を管理する仕組み
- モジュールの管理は go.mod と go.sum ファイルによって実現
go mod init
でモジュールを初期化go get
で依存パッケージを追加または更新go mod tidy
で依存関係の整理が可能- go.sum により環境間で再現性の高いビルドを実現
- プライベートモジュールは
GOPRIVATE
設定で管理 - Go 1.16 以降、モジュールモードがデフォルト
[Next] Step 2-13: Marshalling & Unmarshalling JSON
[Prev] Step 2-11: ポインタ(Pointers)