前提条件
- Go 1.18 以降のインストール。
- コードを編集するためのツール。 お持ちのテキストエディタで問題ありません。
- コマンドターミナル。 GoはLinuxやMacの任意のターミナル、WindowsのPowerShellやcmdでうまく動作します。
このチュートリアルではGo 1.18以降が必要です。go.dev/dlのリンクを使用してGo 1.18以降をインストールしたことを確認してください。
コードのモジュールを作成する
まず、書くコードのためのモジュールを作成します。
- 1. コマンドプロンプトを開き、ホームディレクトリに移動します。
LinuxまたはMacの場合:
Windowsの場合:$ cd
チュートリアルの残りの部分では、プロンプトとして$が表示されます。使用するコマンドはWindowsでも動作します。C:\> cd %HOMEPATH%
- 2. コマンドプロンプトから、コード用のディレクトリをworkspaceという名前で作成します。
$ mkdir workspace
$ cd workspace
3. モジュールを初期化します
私たちの例では、golang.org/x/exampleモジュールに依存する新しいモジュールhello
を作成します。
helloモジュールを作成します:$ mkdir hello
$ cd hello
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
go get
を使用してgolang.org/x/example/hello/reverseパッケージへの依存関係を追加します。$ go get golang.org/x/example/hello/reverse
helloディレクトリに以下の内容を持つhello.goを作成します:
package main
import (
"fmt"
"golang.org/x/example/hello/reverse"
)
func main() {
fmt.Println(reverse.String("Hello"))
}
次に、helloプログラムを実行します:
$ go run .
olleH
ワークスペースを作成する
このステップでは、モジュールを指定するためのgo.work
ファイルを作成します。
ワークスペースを初期化する
``````bash
$ go work init ./hello
`
go work init
コマンドはgo
に対して、go.work
ファイルを作成するよう指示します。これは./hello
ディレクトリ内のモジュールを含むワークスペースのためのものです。
``````bash
go 1.18
use ./hello
`
`````go`````ディレクティブは、ファイルがどのGoのバージョンで解釈されるべきかをGoに指示します。これは`````go`````ディレクティブに似ています。
`````use`````ディレクティブは、`````hello`````ディレクトリ内のモジュールがビルド時にメインモジュールであるべきことをGoに指示します。
したがって、`````workspace`````の任意のサブディレクトリ内でモジュールがアクティブになります。
<a name="run-the-program-in-the-workspace-directory"></a>
#### ワークスペースディレクトリでプログラムを実行する
`````workspace`````ディレクトリで、次のコマンドを実行します:
``````bash
$ go run ./hello
olleH
`
Goコマンドは、ワークスペース内のすべてのモジュールをメインモジュールとして含めます。これにより、モジュールの外部でもモジュール内のパッケージを参照できます。モジュールまたはワークスペースの外でgo run
コマンドを実行するとエラーが発生します。なぜなら、go
コマンドはどのモジュールを使用するかを知らないからです。
次に、golang.org/x/example/hello
モジュールのローカルコピーをワークスペースに追加します。そのモジュールはgo.googlesource.com/example
Gitリポジトリのサブディレクトリに保存されています。次に、reverse
パッケージに新しい関数を追加し、String
の代わりに使用できるようにします。
golang.org/x/example/helloモジュールをダウンロードして修正する
このステップでは、golang.org/x/example/hello
モジュールを含むGitリポジトリのコピーをダウンロードし、ワークスペースに追加し、helloプログラムから使用する新しい関数を追加します。
- 1. リポジトリをクローンする
ワークスペースディレクトリから、次のgit
コマンドを実行してリポジトリをクローンします:$ git clone https://go.googlesource.com/example
Cloning into 'example'...
remote: Total 165 (delta 27), reused 165 (delta 27)
Receiving objects: 100% (165/165), 434.18 KiB | 1022.00 KiB/s, done.
Resolving deltas: 100% (27/27), done.
2. モジュールをワークスペースに追加する
Gitリポジトリは./example
にチェックアウトされました。golang.org/x/example/hello
モジュールのソースコードは./example/hello
にあります。これをワークスペースに追加します:$ go work use ./example/hello
go work use
コマンドは、go.workファイルに新しいモジュールを追加します。今は次のようになります:go 1.18
use (
./hello
./example/hello
)
ワークスペースには
example.com/hello
モジュールとgolang.org/x/example/hello
モジュールが含まれ、golang.org/x/example/hello/reverse
パッケージを提供します。
これにより、reverse
パッケージのコピーに書く新しいコードを使用できるようになります。go get
コマンドでダウンロードしたモジュールキャッシュ内のパッケージのバージョンの代わりに使用します。3. 新しい関数を追加します。
`````workspace/example/hello/reverse`````ディレクトリに`````int.go`````という名前の新しいファイルを作成し、以下の内容を含めます:
``````bash
package reverse
import "strconv"
// Int returns the decimal reversal of the integer i.
func Int(i int) int {
i, _ = strconv.Atoi(String(strconv.Itoa(i)))
return i
}
`
4. helloプログラムを修正して関数を使用します。
``````bash
package main
import (
"fmt"
"golang.org/x/example/hello/reverse"
)
func main() {
fmt.Println(reverse.String("Hello"), reverse.Int(24601))
}
`
ワークスペース内でコードを実行する
ワークスペースディレクトリから、次のコマンドを実行します:
$ go run ./hello
olleH 10642
Goコマンドは、example.com/hello
モジュールをhello
ディレクトリ内のgo.work
ファイルで指定されたコマンドラインから見つけ、golang.org/x/example/hello/reverse
インポートをgo.work
ファイルを使用して解決します。
2つのモジュールが同じワークスペースにあるため、1つのモジュールで変更を加え、別のモジュールで使用するのが簡単です。
<a name="future-step"></a>
#### 今後のステップ
これらのモジュールを適切にリリースするには、`````golang.org/x/example/hello`````モジュールのリリースを行う必要があります。例えば`````v0.1.0`````で行います。これは通常、モジュールのバージョン管理リポジトリでコミットにタグを付けることで行われます。詳細については、[モジュールリリースワークフローのドキュメント](/read/go-latest/92e21fe9493680af.md)を参照してください。リリースが完了したら、`````golang.org/x/example/hello`````モジュールの要件を`````hello/go.mod`````で増やすことができます:
``````bash
cd hello
go get golang.org/x/example/hello@v0.1.0
`
その方法で、go
コマンドはワークスペースの外でモジュールを適切に解決できます。
ワークスペースについてもっと学ぶ
go
コマンドには、チュートリアルで以前に見たgo work init
に加えて、ワークスペースで作業するためのいくつかのサブコマンドがあります:
go work use [-r] [dir]
は、dir
のためにgo.work
ファイルにuse
ディレクティブを追加し、引数のディレクトリが存在しない場合はuse
ディレクトリを削除します。-r
フラグは、dir
のサブディレクトリを再帰的に調べます。go work edit
は、go mod edit
に似てgo.work
ファイルを編集します。go work sync
は、ワークスペースのビルドリストから各ワークスペースモジュールに依存関係を同期します。
Go Modules Referenceのワークスペースを参照して、ワークスペースとgo.work
ファイルの詳細を確認してください。