見出し画像

【Go初学】モジュールモードでローカルのパッケージ参照を解決する

概要

モジュールモードでローカルのパッケージ参照を解決して構築する手順について簡単に書きたい。大まかな流れとしては、「プロジェクトをgit管理下に置く」「プロジェクトをモジュール管理下に置く」「パッケージを参照する」となる。

▼プロジェクトをgit管理下に置く

まず最初にターミナルを開き、プロジェクトを構築したいディレクトリへ移動し、git管理下に置くようにする。

// プロジェクトを構築したいディレクトリへ移動
$ cd <ディレクトリへのパス>

例)
$ cd /Users/<ユーザー名>/Documents/Study/go_mod_sample

// git管理下に置く
$ git init

▼リモートリポジトリを作成

GitHubにリモートリポジトリを作成し、リモートへプッシュ出来る状態にする。プライベートの開発であっても、ちょっと言語構文の動作確認を調べたいようないつ無くなっても困らない一時的なものでない限りはgitでリモート管理した方が、ローカルPCが壊れてもリモートリポジトリから復旧出来たり、別ブランチに切り替えて作業出来たりメリットは大きい。

GitHubのリポジトリ作成画面

■Repository name
リポジトリ名。公開する場合はリポジトリの目的を表す名前が望ましい。
Descripttion
このリポジトリの説明。リポジトリの目的を簡潔に表すものが望ましい。
■Public/Private
リポジトリの公開設定。
Publicの場合はリポジトリのURLを知っている人なら誰でもアクセスできる。誰かに共有したい場合はPublicにする必要がある。逆に共有してはいけない外部サービスのパスワードなど秘匿情報はPublicのリポジトリに絶対にコミットしてはいけない(Privateであっても可能な限りしない)。
Privateの場合はリポジトリを確認出来るのは基本的に自分のみになる。
公開=共有したいもの、なので外部に見てもらいたい理由がない場合はPrivateに設定するのが無難(後でPublicに変更可能)。
■Add a README file
リポジトリに訪れた人が確認できる内容。リポジトリの概要、実行可能なものであればその手順や基本的な利用方法などを記載する。
Add .gitignore
リポジトリ下のファイルでgit管理下に置かないものを定義する.gitignoreファイルを追加するかどうか、追加する際はどの言語に対応したものを追加するかを選択する。言語を選択すると、その言語の開発でよく定義されるgit非管理ファイルの拡張子やディレクトリが自動的に追加されたものが生成される。
Choose a lisence
リポジトリの共有ライセンス形態の指定。ソースコードを改変して良いのか、再配布して良いのか、様々なライセンスから選択し、対応したランセンスファイルが生成される。公開しない場合は気にする必要がないが、公開する場合は特に理由が無ければ制限の緩いMIT Lisenceあたりで良いと思われる。

次にリモートリポジトリを設定しておく(リポジトリ指定はリポジトリ画面の「Code」から取得できる)。

$ git remote add origin <リポジトリ指定>

例)
$ git remote add origin https://github.com/ArtefactGitHub/go_mod_sample.git
GitHubの作成したリポジトリのTOP画面

ローカルの状態を作成したリポジトリの状態と同期するため、リポジトリの最新状態をフェッチし、mainブランチをチェックアウトする。チェックアウトすると自動で生成されたLICENSEファイルなどが取得出来ていることがわかる。

$ git fetch origin
$ git checkout main
VS Codeで同期された状態を確認

▼モジュール管理下に置く

以前は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ファイルを確認

こちらの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を作成し、依存関係にあるパッケージで全て対応が必要で、ととても煩雑なことをしてしまっていた。
同じような勘違いする人はそうそういないかと思うが役立てればとまとめてみた。


この記事が気に入ったらサポートをしてみませんか?