前回
Goの公式チュートリアルをやってみる【モジュールの作成】初めに
前回は簡単な一つのモジュールを作成しました。ですが、実際にモジュールを開発する際は一つではなく、複数のモジュールを使用して開発を行います。
今回は複数のモジュールを開発する際に、一度にビルドして実行する方法を学んでいきます。
今回もhello
モジュールを作成しますが、前回のhello
モジュールとは違いますので退避することをお勧めいたします。
また、今回はGitを使用しますので、事前にダウンロードとインストールをお願いいたします。
helloモジュールの作成
まずは一つ目のモジュールとなる、hello
モジュールを作成しましょう。
最初にworkspace
フォルダを作成します。そしてその中にhello
フォルダを作成し、コマンドプロンプトでhello
フォルダに移動します。その後go mod init example.com/hello
コマンドを実行してモジュールを作成します。
go.mod
ファイルが生成されたことを確認したら、go get golang.org/x/example/hello/reverse
コマンドを実行し、golang.org/x/example/hello/reverse
パッケージの依存関係を取得します。
そして、hello.go
ファイルを作成して以下のコードを追加します。
package main
import (
"fmt"
"golang.org/x/example/hello/reverse"
)
func main() {
fmt.Println(reverse.String("Hello"))
}
コードを追加したら実際に実行して出力を確認してみましょう。
以下の出力を得られたら、作成完了です。
$ go run .
olleH
ワークスペースの作成
ワークスペースの初期化
workspace
ディレクトリに移動し、go work init ./hello
コマンドを実行します。すると、以下のようなgo.work
ファイルが生成されます。
go 1.22.5
use ./hello
go.work
ファイルはgo.mod
と似た構文を持っています。go
ディレクティブは、ファイルがどのバージョンのGoで解釈されるべきかを指示します。use
ディレクティブは、ビルドする際にhello
ディレクトリのモジュールをメインモジュールにするようにGoへ指示しています。これで、workspace
内のどのディレクトリでもこのモジュールがアクティブになるようになりました。
workspaceディレクトリでプログラムを実行
workspace
ディレクトリで以下のコマンドを実行してみましょう。
$ go run ./hello
olleH
コマンドが実行できたら正常にワークスペースを初期化できています。
Goのコマンドはワークスペース内のすべてのモジュールをメインモジュールとして含むようになりました。これでモジュールの外でもモジュールの内のパッケージを参照できるようになります。
次にgolang.org/x/example/hello
モジュールのローカルコピーをワークスペースに追加しましょう。そしてString
の代わりに使える関数をreverse
パッケージに追加します。
golang.org/x/example/helloモジュールのダウンロードと修正
リポジトリのクローン
まずは対象のモジュールのリポジトリをGitを用いてクローンします。workspace
ディレクトリで以下のコマンドを入力してください。
$ git clone https://go.googlesource.com/example
Cloning into 'example'...
Rremote: Total 389 (delta 133), reused 389 (delta 133)
Receiving objects: 100% (389/389), 349.16 KiB | 1.75 MiB/s, done.
Resolving deltas: 100% (133/133), done.
モジュールをワークスペースに追加
対象のリポジトリをクローンしたら、workspace
ディレクトリにexample
フォルダがチェックアウトされました。workspace/example/hello
にgolang.org/x/example/hello
モジュールがありますので、ワークスペースに追加していきましょう。workspace
ディレクトリでgo work use ./example/hello
コマンドを実行しましょう。
go 1.18
use (
./hello
./example/hello
)
go.work
ファイルを確認すると上記の様にモジュールが追加されていることを確認できます。このワークスペースにはexample.com/hello
モジュールとgolang.org/x/example/hello
モジュールの両方が含まれるようになり、golang.org/x/example/hello/reverse
が提供されるようになりました。これでgo get
コマンドでダウンロードしたモジュールキャッシュのパッケージのバージョンではなく、reverse
パッケージのコピーに書かれた新しいコードを使用することができます。
関数の追加
golang.org/x/example/hello/reverse
パッケージに、数字を反転させる関数を追加しましょう。workspace/example/hello/reverse
ディレクトリに以下の内容のint.go
というファイルを作成します。
package reverse
import "strconv"
// 整数 i の 10 進数の逆数を返します。
func Int(i int) int {
i, _ = strconv.Atoi(String(strconv.Itoa(i)))
return i
}
そして、追加した関数を使用するようにhello
パッケージを変更しましょう。
package main
import (
"fmt"
"golang.org/x/example/hello/reverse"
)
func main() {
fmt.Println(reverse.String("Hello"), reverse.Int(24601))
}
実行確認
コマンドプロンプトでworkspace
ディレクトリに移動し、go run ./hello
コマンドを実行しましょう。
$ go run ./hello
olleH 10642
go
コマンドはコマンドラインで指定されたexample.com/hello
モジュールをgo.work
ファイルで指定されたhello
ディレクトリで見つけ、同様にgolang.org/x/example/hello/reverse
のインポートをgo.work
ファイルを使用して解決します。go.work
はreplace
ディレクティブを追加する代わりに使うことで、複数のモジュールにまたがって動作させることができます。2つのモジュールは同じワークスペースで管理されているので、片方のモジュールに変更が加わっても簡単にもう片方で使用することができます。
リリース
リリースする際はモジュールごとにバージョンを付与して管理します。通常はGitなどのバージョン管理システムのリポジトリにコミットタグを付与して管理します。モジュールをほかの人が使用できる形になったらv0を。安定板になったらv1を、破壊的なアップグレードになる場合はv2を検討しますが、最後の手段としましょう。詳細は公式の『モジュールのリリースとバージョニングのワークフロー』を参考にしてください。
まとめ
go work init xxx/yyy
でワークスペースの初期化を行うgo work use aaa/bbb
でワークスペースにモジュールを追加する- ワークスペースのトップにワークスペースの情報がまとまった
go.work
ファイルが生成される - ワークスペースを使用するとワークスペース内であればどこでもモジュールを実行できるようになる