[[Go]]の[[モジュール (Go)|モジュール]]を作成するメモ。以下の公式を参考に。 <div class="link-card"> <div class="link-card-header"> <img src="https://go.dev/images/favicon-gopher.png" class="link-card-site-icon"/> <span class="link-card-site-name">go.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Developing and publishing modules - The Go Programming Language</p> </div> <div class="link-card-description"> </div> </div> </div> <a href="https://go.dev/doc/modules/developing"></a> </div> ## モジュールの作成 以下を参考に[[モジュール (Go)|モジュール]]をつくる。 <div class="link-card"> <div class="link-card-header"> <img src="https://go.dev/images/favicon-gopher.png" class="link-card-site-icon"/> <span class="link-card-site-name">go.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Tutorial: Create a Go module - The Go Programming Language</p> </div> <div class="link-card-description"> </div> </div> </div> <a href="https://go.dev/doc/tutorial/create-module"></a> </div> ```console mkdir greetings cd greetings go mod init mamansoft.net/greetingss ``` `greetings.go`を作成。 ```go package greetings import "fmt" // Hello returns a greeting for the named person. func Hello(name string) string { // Return a greeting that embeds the name in a message. message := fmt.Sprintf("Hi, %v. Welcome!", name) return message } ``` ## 作成したモジュールを呼び出す ライブラリ用[[モジュール (Go)|モジュール]]を呼び出すため、ライブラリ利用用[[モジュール (Go)|モジュール]]を作成する。 ```console mkdir greetings-use cd greetings-use go mod init mamansoft.net/greetings-use ``` 非公開[[モジュール (Go)|モジュール]]をローカルに向ける設定を[[go.mod]]に追加するため、以下のコマンドを実行。 ```console go mod edit -replace="mamansoft.net/[email protected]=../greetings" ``` これで `mamansoft.net/[email protected]`が`../greetings`と解釈されるようになったので、通常通り`go get`を実行。 ```console $ go get mamansoft.net/[email protected] go: added mamansoft.net/greetings v0.0.0-unpublished ``` `greetings-use.go`を作成。この時点でimportが成功していればまずOK。 ```go package main import ( "fmt" "mamansoft.net/greetings" ) func main() { message := greetings.Hello("はろおーーーー!!") fmt.Print(message) } ``` 実行。 ```console $ go run . Hi, はろおーーーー!!. Welcome! ``` ## [[GitHub]]で公開モジュールを開発する 今まではローカル前提だったが、全世界から利用できるように[[GitHub]]でリポジトリを作成し、それを[[モジュール (Go)|モジュール]]として公開してみる。 ### リポジトリ作成 https://github.com/tadashi-aikawa/go-module-sample 上記をクローンし、[[モジュール (Go)|モジュール]]の初期化。 ```console go mod init github.com/tadashi-aikawa/go-module-sample ``` `root/root.go`を作成。 ```go package root func HundredTake(value string) []string { arr := make([]string, 100) for i := range arr { arr[i] = value } return arr } ``` #### 利用プロジェクト作成 ```console mkdir go-module-sample-use cd go-module-sample-use go mod init mamansoft.net/go-module-sample-use go mod edit -replace="github.com/tadashi-aikawa/[email protected]=../../git/github.com/tadashi-aikawa/go-module-sample" go get github.com/tadashi-aikawa/[email protected] ``` `main.go`を作成。 ```go package main import ( "fmt" "github.com/tadashi-aikawa/go-module-sample/root" ) func main() { result := root.HundredTake("TAKE") fmt.Print(result) } ``` 実行。 ```console $ go run . [TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE] ``` ### モジュールv0.1をリリース コミット/プッシュをしたあと、タグ付けする。 ```console git tag v0.1.0 git push --tags ``` これでOK。 > [!caution] > `git tag v0.1.0 -m 0.1.0` のように `-m` オプションをつけるとタグが見つからず、後のダウンロードに失敗する。 ### 公開されたモジュールを使ってみる `go-module-sample-use`に戻って、`replace`を削除する。[[go.mod]]が以下のように。 ```diff module mamansoft.net/go-module-sample-use go 1.20 - replace github.com/tadashi-aikawa/go-module-sample v0.1.0 => ../../git/github.com/tadashi-aikawa/go-module-sample require github.com/tadashi-aikawa/go-module-sample v0.1.0 // indirect ``` もう一度インストール。 ```console $ go get github.com/tadashi-aikawa/[email protected] go: downloading github.com/tadashi-aikawa/go-module-sample v0.1.0 ``` `go run .`で動けばOK。 ### モジュールのバージョンをアップしてみる 100は流石に多いので10に変更し、`v0.2.0`としてリリースしてみる。`go-module-sample`の`root/root.go`を変更。 ```go package root func TenTake(value string) []string { arr := make([]string, 10) for i := range arr { arr[i] = value } return arr } ``` 変更点をコミット・プッシュしてから再びリリース。 ```console git tag v0.2.0 git push --tags ``` `go-module-sample-use`に移動していくつか動作を確認。今回は[[go.mod]]のバージョンを変更してみる。 ```diff module mamansoft.net/go-module-sample-use go 1.20 - require github.com/tadashi-aikawa/go-module-sample v0.1.0 + require github.com/tadashi-aikawa/go-module-sample v0.2.0 ``` [[go mod tidy]]で最新化。 ```console $ go mod tidy go: downloading github.com/tadashi-aikawa/go-module-sample v0.2.0 ``` メソッド名が変わっているので`main.go`を以下のように変更。 ```go package main import ( "fmt" "github.com/tadashi-aikawa/go-module-sample/root" ) func main() { result := root.TenTake("TAKE") fmt.Print(result) } ``` そして実行。 ```console $ go run . [TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE TAKE] ``` **GREAT**👍