GOPATH とモジュール

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Go における依存関係の管理方法である GOPATH と Go Modules について学びます。これらは、Go プロジェクトを効果的に組織化して管理するための重要な概念です。

学習ポイント

  • GOPATH
  • GOROOT
  • Go Modules
これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 中級 レベルの実験の完了率は 73%です。学習者から 95% の好評価を得ています。

準備

このステップでは、提供された tarball を解凍することで環境を準備します。

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

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

    tar -xzf helloWorld.tar.gz
  3. ファイルが抽出された後、helloWorldフォルダが作成されたかどうかを確認します。

    ls helloWorld

これは、helloWorldディレクトリが正しく解凍された場合、その内容を一覧表示します。

基本的なモジュール GOPATH

Go 1.11 以前は、Go はすべての Go コードを格納するためにGOPATHと呼ばれる特定のワークスペースを使用していました。このステップでは、GOPATH がどのように機能するかを理解します。

  1. GOROOTは、Go がインストールされているディレクトリであり、そのツールや標準ライブラリパッケージも含まれています。
  2. GOPATHは、あなたの個人的な Go コードが存在する場所であり、3 つのディレクトリが含まれています。
    • src:あなたのプロジェクトのソースコードを格納します。
    • bin:コンパイル済みの実行可能ファイルを格納します。
    • pkg:実行可能ではないコンパイル済みのパッケージを格納します。

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

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

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

これらのコマンドは、あなたのマシン上のGOPATHGOROOTのパスを表示します。

mod を初期化する

Go 1.11 で導入され、Go 1.13 ではデフォルトで有効になった Go Modules は、2 つの主要な問題を解決することを目的としています。

  • GOPATH への過度の依存:Go Modules が登場する前は、コードをGOPATH/srcディレクトリ内に保存する必要がありました。Go Modules を使用することで、コードをシステム内の任意の場所に保存できます。
  • バージョン依存関係の問題:Go Modules を使うことで、プロジェクトが特定のバージョンの依存関係を管理して追跡できるようになり、同じパッケージの複数のバージョンを扱う際に作業がしやすくなります。

このステップでは、新しいプロジェクトに対して Go Module を初期化します。

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

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

    cd testHello
  3. このプロジェクト用の Go Module を初期化します。

    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 Modules を使ってtestHelloプロジェクトを初期化し、簡単な Go プログラムを追加しました。

mod を使って他のパッケージをインポートする

このステップでは、Go プロジェクトで他のモジュールをインポートして使用する方法を示します。

helloWorldフォルダ内のhelloWorldパッケージは Go Modules で初期化されています。同様に、Go Modules を使用する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ディレクティブは、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 からのリモートパッケージを使用してこれを示しましょう。

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

    cd ~/project
    mkdir remoteModule
    cd remoteModule
  2. Go Module を初期化します。

    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 Module を初期化します。

    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
✨ 解答を確認して練習

まとめ

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

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

この実験が終了するまでに、Go プロジェクトで依存関係を管理するために Go Modules を使いこなせるようになっているはずです。