GOPATH と Go モジュール

GolangBeginner
オンラインで実践に進む

はじめに

この実験では、Go 言語における依存関係管理の 2 つの異なる手法である GOPATHGo モジュール(Go Modules) について学びます。これらは、Go プロジェクトを効果的に整理・管理するために不可欠な概念です。

学習ポイント:

  • GOPATH
  • GOROOT
  • Go モジュール(Go Modules)

準備

このステップでは、提供されたアーカイブファイルを解凍して、実験環境を準備します。

  1. まず、ターミナルを開き、以下のコマンドを入力してプロジェクトディレクトリに移動します。

    cd ~/project
  2. カレントディレクトリにある helloWorld.tar.gz ファイルを解凍します。

    tar -xzf helloWorld.tar.gz
  3. ファイルの展開後、helloWorld フォルダが作成されているか確認します。

    ls helloWorld

正しく解凍されていれば、helloWorld ディレクトリの内容が表示されます。

GOPATH の基本

Go 1.11 より前のバージョンでは、Go はすべてのソースコードを保存するために GOPATH と呼ばれる特定のワークスペースを使用していました。このステップでは、GOPATH の仕組みを理解しましょう。

  1. GOROOT は、Go がインストールされているディレクトリであり、Go のツールや標準ライブラリパッケージが含まれています。
  2. GOPATH は、ユーザー自身の Go コードが置かれる場所で、以下の 3 つのディレクトリで構成されます。
    • src: プロジェクトのソースコードを保存します。
    • bin: コンパイルされた実行ファイルを保存します。
    • pkg: 実行ファイルではない、コンパイル済みのパッケージを保存します。

現在の GOPATHGOROOT を確認するには、以下のコマンドを実行します。

## GOPATH ディレクトリを確認する
go env | grep GOPATH

## GOROOT ディレクトリを確認する
go env | grep GOROOT

これらのコマンドにより、お使いの環境における GOPATHGOROOT のパスが表示されます。

モジュールの初期化

Go 1.11 で導入され、Go 1.13 からデフォルトで有効になった Go モジュール(Go Modules)は、主に以下の 2 つの問題を解決することを目的としています。

  • GOPATH への過度な依存: Go モジュール以前は、コードを必ず GOPATH/src ディレクトリ内に配置する必要がありました。Go モジュールを使用すると、システムの任意の場所にコードを保存できます。
  • 依存関係のバージョン管理: Go モジュールでは、プロジェクトが特定のバージョンの依存関係を管理・追跡できるため、同じパッケージの異なるバージョンを扱うのが容易になります。

このステップでは、新しいプロジェクトで Go モジュールを初期化します。

  1. testHello という名前の新しいプロジェクトディレクトリを作成します。

    cd ~/project
    mkdir testHello
  2. testHello ディレクトリに移動します。

    cd testHello
  3. このプロジェクトの Go モジュールを初期化します。

    go mod init testHello

    出力結果は以下のようになります。

    go: creating new go.mod: module testHello
  4. 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 関数をインポートしています。

内容を確認するために、以下の手順を実行してください。

  1. まず、helloWorldtest ディレクトリの構造を確認します。

    helloWorld
    ├── go.mod
    └── helloWorld.go
    test
    ├── go.mod
    └── test.go
  2. 次に、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 上のリモートパッケージを使用して、これを試してみましょう。

  1. remoteModule ディレクトリを作成します。

    cd ~/project
    mkdir remoteModule
    cd remoteModule
  2. Go モジュールを初期化します。

    go mod init remoteModule
  3. 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 関数を使用します。

  4. 以下のコマンドを使用して 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 関数を使用する新しいファイルを作成し、これまでの知識をテストします。

  1. remoteModule2 フォルダを作成します。

    cd ~/project
    mkdir remoteModule2
    cd remoteModule2
  2. Go モジュールを初期化します。

    go mod init remoteModule2
  3. 以下の内容で remote2.go ファイルを作成します。

    touch remote2.go
    package main
    
    import (
        "github.com/labex-labs/golang-dev-code/chap02module"
    )
    
    func main() {
        chap02module.Hello()
    }
  4. プログラムを実行します。

    go get github.com/labex-labs/golang-dev-code/chap02module
    go run remote2.go

    出力結果は以下の通りです。

    hello
✨ 解答を確認して練習

まとめ

この実験では、以下の内容を学びました。

  • GOPATH および GOROOT ディレクトリの意味と目的。
  • 依存関係を管理するための Go モジュールの基礎。
  • プロジェクトで Go モジュールを初期化し、使用する方法。
  • ローカルおよびリモートの Go パッケージをインポートして使用する方法。

この実験を終えることで、Go プロジェクトの依存関係を管理するために Go モジュールを使いこなせるようになっているはずです。