はじめに
この実験では、Go における依存関係の管理方法である GOPATH と Go Modules について学びます。これらは、Go プロジェクトを効果的に組織化して管理するための重要な概念です。
学習ポイント:
- GOPATH
- GOROOT
- Go Modules
この実験では、Go における依存関係の管理方法である GOPATH と Go Modules について学びます。これらは、Go プロジェクトを効果的に組織化して管理するための重要な概念です。
学習ポイント:
このステップでは、提供された tarball を解凍することで環境を準備します。
まず、ターミナルを開き、以下を入力してプロジェクトディレクトリに移動します。
cd ~/project
現在のディレクトリにあるhelloWorld.tar.gz
ファイルを解凍します。
tar -xzf helloWorld.tar.gz
ファイルが抽出された後、helloWorld
フォルダが作成されたかどうかを確認します。
ls helloWorld
これは、helloWorld
ディレクトリが正しく解凍された場合、その内容を一覧表示します。
Go 1.11 以前は、Go はすべての Go コードを格納するためにGOPATH
と呼ばれる特定のワークスペースを使用していました。このステップでは、GOPATH がどのように機能するかを理解します。
GOROOT
は、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 Modules は、2 つの主要な問題を解決することを目的としています。
GOPATH/src
ディレクトリ内に保存する必要がありました。Go Modules を使用することで、コードをシステム内の任意の場所に保存できます。このステップでは、新しいプロジェクトに対して Go Module を初期化します。
testHello
という名前の新しいプロジェクト用のディレクトリを作成します。
cd ~/project
mkdir testHello
testHello
ディレクトリに移動します。
cd testHello
このプロジェクト用の Go Module を初期化します。
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 Modules を使ってtestHello
プロジェクトを初期化し、簡単な Go プログラムを追加しました。
このステップでは、Go プロジェクトで他のモジュールをインポートして使用する方法を示します。
helloWorld
フォルダ内のhelloWorld
パッケージは Go Modules で初期化されています。同様に、Go Modules を使用する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
ディレクティブは、Go に対して外部リポジトリから取得する代わりに、ローカルパス../helloWorld
を使用するように指示します。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 Module を初期化します。
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 Module を初期化します。
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 Modules を使いこなせるようになっているはずです。