[[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**👍