この記事で書くこと
Goの仕組みを知るために、Goで簡単なモジュールを作ってみました。
この記事ではgo getの使い方、Module-awareモードの違いについて書いています。
GOPATHモードとModule-awareモードの違い
Goモジュールの扱いはGOPATHモードとModule-awareモードで少し異なります。ざっくり説明すると、Module-awareモードはGOPATHモードにバージョン管理機能がついたようなものです。Goバージョン1.16からデフォルトでModule-awareモードがオンになっています。
現在どちらのモードになっているかは環境変数「GO111MODULE」をみるとわかります。
GO111MODULE |
モード |
on |
Module-awareモード |
off |
GOPATHモード |
GO111MODULEがautoの時は以下のようにしてモードが決まります。
GO111MODULE |
カレントディレクトリにgo.modファイルあり |
モード |
auto |
あり |
Module-awareモード |
auto |
なし |
GOPATHモード |
参考:
Go公式ドキュメント
簡単なgoモジュールを作ってみる
簡単なgoの関数を作成してみます。作成するのは以下です。Hoge関数を実行すると”Hoge”文字列を返します。
package hogemodule
func Hoge() string{
// hoge
return "Hoge"
}
- ディレクトリ名:hogemodule
- ファイル名:hogemodule.go
- パッケージ名:hogemodule
次にgo.modファイルを作成します。このファイルがないとモジュールとして認識してくれません。go.modファイルを作成するにはhogemoduleディレクトリで以下のコマンドを打ちます。
go mod init github.com/[ユーザ名]/[githubリポジトリ名]
今回はhogemoduleというリポジトリを作成しようと思いますので以下のコマンドを実行しました。
go mod init github.com/kfuku1634/hogemodule
次に上記リポジトリ名に合わせてgithubリポジトリにこのディレクトリを登録します。今回は以下のリポジトリを作成しました。
kfuku1634/hogemodule
goはgithubリポジトリのタグでバージョンを管理してくれるので、以下のコマンドでタグをつけ、githubリポジトリに反映します。タグはmain(or master)リポジトリをpushしただけでは反映されません。
git tag -a v0.0.1 -m "my version 0.0.1"
git push origin v0.0.1
goモジュールの使用
適当なフォルダで以下のようなファイルを作成します。今回はmain.goというファイル名で作成しました。
package main
import (
"github.com/kfuku1634/hogemodule"
"fmt"
)
func main() {
fmt.Println(hogemodule.Hoge())
}
このディレクトリでgo mod initのコマンドを打ち、goシステムがモジュールとして認識できるようにします。今回のモジュール名はなんでもいいですが適当にmにしました。
この状態でプログラムを実行してみるとエラーになります。
go run main.go
main.go:4:5: no required module provides package github.com/kfuku1634/hogemodule; to add it:
go get github.com/kfuku1634/hogemodule
githubからソースコードをローカルにダウンロードするために、go getのコマンドを打つ必要がありました。go get を実行した後に、go run main.goを実行するとHogeが表示されます。
go get github.com/kfuku1634/hogemodule
go: downloading github.com/kfuku1634/hogemodule v0.0.1
go: added github.com/kfuku1634/hogemodule v0.0.1
go run main.go
Hoge
go getでダウンロードしたディレクトリは環境変数「GOPATH」以下のpkgフォルダで管理されています。v0.0.1は先ほどつけたタグと一致します。
cd $GOPATH/pkg/mod/github.com/kfuku1634/hogemodule@v0.0.1
【応用編】サブディレクトリにモジュールを作成
先ほど作成したディレクトリの下にモジュールを作成してみます。サブディレクトリ名はhogedirにし、hogedirにhogedir.goファイルを作成しました。ここまでで作成したディレクトリ構造は以下のようになります。
tree hogemodule
hogemodule
├── go.mod
├── hogedir
│ └── hogedir.go
└── hogemodule.go
hogedir.goは以下のようにしました。Hogedir関数を実行すると”Hogedir”文字列を返します。
package hogedir
func Hogedir() string{
return "Hogedir"
}
先ほどと同様にgitでタグ付けしてコミットします。tagはバージョンを一つ上げています。
git tag -a v0.0.2 -m "my version 0.0.2"
git push origin v0.0.2
先ほどのmain.goに以下のような追記をします。
package main
import (
"github.com/kfuku1634/hogemodule"
"github.com/kfuku1634/hogemodule/hogedir" //追加
"fmt"
)
func main() {
fmt.Println(hogemodule.Hoge())
fmt.Println(hogedir.Hogedir()) //追加
}
go run main.goをするとエラーが出ます。先ほどgo getした時と同様に新しく作成したv0.0.2のディレクトリをダウンロードする必要があります。しかし、先ほどと同じコマンドを使ってもv0.0.2はインストールされません。原因はgo.modファイルでバージョンが固定されているからです。1度目にダウンロードした時に自動でバージョンを登録してくれています。go.modファイルを見てみると、以下のようにバージョンv0.0.1に固定されているのがわかります。
module m
go 1.18
require github.com/kfuku1634/hogemodule v0.0.1 // indirect
バージョンを更新するにはgo getの際にバージョンを指定する必要があります。
go get github.com/kfuku1634/hogemodule@v0.0.2
するとバージョンが更新されます。
module m
go 1.18
require github.com/kfuku1634/hogemodule v0.0.2 // indirect
go run main.go [~/test/test13]
Hoge
Hogedir
コメント