【Go初学】モジュールモードでローカルのパッケージ参照を解決する
概要
モジュールモードでローカルのパッケージ参照を解決して構築する手順について簡単に書きたい。大まかな流れとしては、「プロジェクトをgit管理下に置く」「プロジェクトをモジュール管理下に置く」「パッケージを参照する」となる。
▼プロジェクトをgit管理下に置く
まず最初にターミナルを開き、プロジェクトを構築したいディレクトリへ移動し、git管理下に置くようにする。
// プロジェクトを構築したいディレクトリへ移動
$ cd <ディレクトリへのパス>
例)
$ cd /Users/<ユーザー名>/Documents/Study/go_mod_sample
// git管理下に置く
$ git init
▼リモートリポジトリを作成
GitHubにリモートリポジトリを作成し、リモートへプッシュ出来る状態にする。プライベートの開発であっても、ちょっと言語構文の動作確認を調べたいようないつ無くなっても困らない一時的なものでない限りはgitでリモート管理した方が、ローカルPCが壊れてもリモートリポジトリから復旧出来たり、別ブランチに切り替えて作業出来たりメリットは大きい。
次にリモートリポジトリを設定しておく(リポジトリ指定はリポジトリ画面の「Code」から取得できる)。
$ git remote add origin <リポジトリ指定>
例)
$ git remote add origin https://github.com/ArtefactGitHub/go_mod_sample.git
ローカルの状態を作成したリポジトリの状態と同期するため、リポジトリの最新状態をフェッチし、mainブランチをチェックアウトする。チェックアウトすると自動で生成されたLICENSEファイルなどが取得出来ていることがわかる。
$ git fetch origin
$ git checkout main
▼モジュール管理下に置く
以前はGOPATHモードというプロジェクト管理方法があり、こちらは特定のディレクトリ以下をモジュール管理する方法で、プロジェクトの配置場所に自由度があまり無かったものになる。
Goのバージョン1.11から可能になったモジュールモードは、作成したgo.modファイル以下のディレクトリを1モジュールとして扱う。基本的に1つのリポジトリ(プロジェクト)では、ルートディレクトリで1つのgo.mod ファイルを作成し管理する形になる。
$ go mod init <リポジトリ名 (リポジトリURLのhttps://以降)>
例)
$ go mod init github.com/ArtefactGitHub/go_mod_sample
こちらのgo.modファイルへは、外部パッケージ参照を解決する際に参照命令が自動的に追記されていく。またローカルのパッケージの参照パスを変更する必要がある場合、replace命令の記述を行なっていくものになる。
▼ローカルの別パッケージを参照する
ここからはローカルで作成した別パッケージを参照するサンプルを作成する。最終的には以下の構成になり、「main」パッケージであるmain.goから、calcパッケージであるcalc.goの関数を呼び出すものになる。
.
├── calc
│ └── calc.go
├── .gitignore
├── go.mod
├── LICENSE
├── main.go
└── README.md
まず最初にmain.goを作成する。パッケージ名をmainとし、main関数は空で作成する。
ルートディレクトリ上にcalcディレクトリを作成し、直下にcalc.goを作成する。パッケージは「calc」とし、mainから呼び出すための何らかの公開関数を作成する。
main.goに戻り、以下のようにcalcパッケージの関数を呼び出す処理を記述する。VS Codeに限らずIDEでは、この際にimportを記述せずとも11行目のcalcパッケージ名を付加した関数呼び出しを記述してファイル保存すると自動でimport文が追加される。
ターミナルのプロジェクトのルートディレクトリ上で実行すると、別パッケージ参照が行われ、関数呼び出しが機能することが確認出来る。
$ go run .
1 + 2 = 3
さらに深い階層のパッケージも、ルートのgo.modから辿って参照が解決される。
▼外部パッケージを参照する
GitHubなどで公開されているサードパーティの外部パッケージを参照する場合、参照解決のコマンドを実行する必要がある。
ここでは logrus というログ出力パッケージを利用する例とする。
初めに下記のようにlogrusパッケージにある関数呼び出し、import文を記述する(import文の手動記述が必要)。
この段階ではVS Code上で参照解決がまだ出来ていないため赤文字や赤線が引かれている。参照解決のため、ターミナル上で以下のコマンドを実行する。
$ go mod tidy
このコマンドにより、未解決のパッケージ参照がある場合、import文記述のリポジトリから自動でダウンロードし、参照情報などが go.mod や新しく作成される go.sum ファイルに記述される。
再度実行するとパッケージが利用できていることが確認出来る。
$ go run .
1 + 2 = 3
{"level":"trace","msg":"log test","time":"2022-03-01T12:04:36+09:00"}
あとがき
今回記述した内容はとても基本的な内容だが、1リポジトリで複数go.modファイル管理を作成して管理する勘違いをしてしまっていた。新たにパッケージを追加する度にgo.modやgo.sumを作成し、依存関係にあるパッケージで全て対応が必要で、ととても煩雑なことをしてしまっていた。
同じような勘違いする人はそうそういないかと思うが役立てればとまとめてみた。
この記事が気に入ったらサポートをしてみませんか?