【Go入門】Goでモジュールを作成してgithubで公開するまで【Module-awareモード】

この記事で書くこと

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 mod init 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

    コメント

    タイトルとURLをコピーしました