はじめに
この実験では、Go 言語における依存関係管理の 2 つの異なる手法である GOPATH と Go モジュール(Go Modules) について学びます。これらは、Go プロジェクトを効果的に整理・管理するために不可欠な概念です。
学習ポイント:
- GOPATH
- GOROOT
- Go モジュール(Go Modules)
この実験では、Go 言語における依存関係管理の 2 つの異なる手法である GOPATH と Go モジュール(Go Modules) について学びます。これらは、Go プロジェクトを効果的に整理・管理するために不可欠な概念です。
学習ポイント:
このステップでは、提供されたアーカイブファイルを解凍して、実験環境を準備します。
まず、ターミナルを開き、以下のコマンドを入力してプロジェクトディレクトリに移動します。
cd ~/project
カレントディレクトリにある helloWorld.tar.gz ファイルを解凍します。
tar -xzf helloWorld.tar.gz
ファイルの展開後、helloWorld フォルダが作成されているか確認します。
ls helloWorld
正しく解凍されていれば、helloWorld ディレクトリの内容が表示されます。
Go 1.11 より前のバージョンでは、Go はすべてのソースコードを保存するために GOPATH と呼ばれる特定のワークスペースを使用していました。このステップでは、GOPATH の仕組みを理解しましょう。
GOROOT は、Go がインストールされているディレクトリであり、Go のツールや標準ライブラリパッケージが含まれています。GOPATH は、ユーザー自身の Go コードが置かれる場所で、以下の 3 つのディレクトリで構成されます。
現在の GOPATH と GOROOT を確認するには、以下のコマンドを実行します。
## GOPATH ディレクトリを確認する
go env | grep GOPATH
## GOROOT ディレクトリを確認する
go env | grep GOROOT
これらのコマンドにより、お使いの環境における GOPATH と GOROOT のパスが表示されます。
Go 1.11 で導入され、Go 1.13 からデフォルトで有効になった Go モジュール(Go Modules)は、主に以下の 2 つの問題を解決することを目的としています。
GOPATH/src ディレクトリ内に配置する必要がありました。Go モジュールを使用すると、システムの任意の場所にコードを保存できます。このステップでは、新しいプロジェクトで Go モジュールを初期化します。
testHello という名前の新しいプロジェクトディレクトリを作成します。
cd ~/project
mkdir testHello
testHello ディレクトリに移動します。
cd testHello
このプロジェクトの Go モジュールを初期化します。
go mod init testHello
出力結果は以下のようになります。
go: creating new go.mod: module testHello
testHello フォルダ内に、以下の内容で新しい Go ファイル testHello.go を作成します。
touch testHello.go
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
これで、Go モジュールを使用して testHello プロジェクトを初期化し、簡単な Go プログラムを追加できました。
このステップでは、Go プロジェクトで他のモジュールをインポートして使用する方法を実演します。
helloWorld フォルダ内の helloWorld パッケージは、すでに Go モジュールで初期化されています。同様に、Go モジュールを使用している test パッケージは、helloWorld パッケージから Say 関数をインポートしています。
内容を確認するために、以下の手順を実行してください。
まず、helloWorld と test ディレクトリの構造を確認します。
helloWorld
├── go.mod
└── helloWorld.go
test
├── go.mod
└── test.go
次に、test/go.mod ファイルを開きます。以下のような内容が記述されているはずです。
module test
go 1.15
require "helloWorld" v0.0.1
replace "helloWorld" => "../helloWorld"
replace ディレクティブは、外部リポジトリから取得する代わりに、ローカルパス ../helloWorld を使用するように Go に指示します。require ディレクティブは、test パッケージが helloWorld パッケージのバージョン v0.0.1 に依存していることを指定しています。
| パラメータ | 説明 |
|---|---|
| module | パッケージ名を指定します |
| require | 依存関係を指定します |
| replace | 依存関係を置き換えます |
| exclude | 依存関係を除外します |
test パッケージ内の test.go ファイルを実行するには、以下のようにします。
cd ~/project/test
go run test.go
出力結果は以下の通りです。
hello, world
Go では、リモートパッケージを簡単にインポートできます。GitHub 上のリモートパッケージを使用して、これを試してみましょう。
remoteModule ディレクトリを作成します。
cd ~/project
mkdir remoteModule
cd remoteModule
Go モジュールを初期化します。
go mod init remoteModule
remoteModule フォルダ内に、以下の内容で remote.go ファイルを作成します。
touch remote.go
package main
import (
"github.com/labex-labs/golang-dev-code/chap02module"
)
func main() {
chap02module.StringTobase64("miiy")
}
このプログラムは、GitHub から chap02module パッケージをインポートし、その中の StringTobase64 関数を使用します。
以下のコマンドを使用して remote.go ファイルを実行します。
go get github.com/labex-labs/golang-dev-code/chap02module
go run -v remote.go
ヒント:無料ユーザーはインターネットにアクセスできないため、このコマンドを実行できません。インターネットアクセスを利用するには、Pro プランへのアップグレードをご検討ください。
go get コマンドは、GitHub から chap02module パッケージをダウンロードし、モジュールキャッシュに保存します。完了後、go run コマンドによってプログラムが実行されます。
このステップでは、リモートモジュールの Hello 関数を使用する新しいファイルを作成し、これまでの知識をテストします。
remoteModule2 フォルダを作成します。
cd ~/project
mkdir remoteModule2
cd remoteModule2
Go モジュールを初期化します。
go mod init remoteModule2
以下の内容で remote2.go ファイルを作成します。
touch remote2.go
package main
import (
"github.com/labex-labs/golang-dev-code/chap02module"
)
func main() {
chap02module.Hello()
}
プログラムを実行します。
go get github.com/labex-labs/golang-dev-code/chap02module
go run remote2.go
出力結果は以下の通りです。
hello
この実験では、以下の内容を学びました。
GOPATH および GOROOT ディレクトリの意味と目的。この実験を終えることで、Go プロジェクトの依存関係を管理するために Go モジュールを使いこなせるようになっているはずです。