GOPATHを理解する

前書き

この記事では、GOPATHとは何か、その仕組み、および設定方法について説明します。 これは、Go開発環境をセットアップするため、およびGoがソースファイルを検索、インストール、およびビルドする方法を理解するための重要なステップです。 この記事では、これから説明するフォルダー構造の概念を参照するときに、GOPATHを使用します。 $GOPATHを使用して、Goがフォルダー構造を見つけるために使用する環境変数を参照します。

Go Workspaceは、Goがソースファイル、コンパイルされたバイナリ、および後でより高速にコンパイルするために使用されるキャッシュされたオブジェクトを管理する方法です。 複数のスペースを使用することも可能ですが、Goワークスペースは1つだけにすることをお勧めします。 GOPATHは、ワークスペースのルートフォルダーとして機能します。

$GOPATH環境変数の設定

$GOPATH環境変数は、GoがGoワークスペースを探す場所をリストします。

デフォルトでは、GoはGOPATHの場所が$HOME/goにあると想定します。ここで、$HOMEはコンピューター上のユーザーアカウントのルートディレクトリです。 これは、$GOPATH環境変数を設定することで変更できます。 詳細については、reading and setting environment variables in Linuxに関するこのチュートリアルに従ってください。

$GOPATH変数の設定の詳細については、Godocumentationを参照してください。

さらに、このseriesは、GoのインストールとGo開発環境のセットアップについて説明します。

$GOPATH$GOROOTではありません

$GOROOTは、Goのコード、コンパイラ、およびツールが存在する場所です。これは、notのソースコードです。 $GOROOTは通常、/usr/local/goのようなものです。 $GOPATHは通常、$HOME/goのようなものです。

$GOROOT変数を特別に設定する必要はなくなりましたが、古い資料では引き続き参照されています。

次に、Goワークスペースの構造について説明します。

Goワークスペースの構造

Goワークスペース(GOPATH)内には、binpkg、およびsrcの3つのディレクトリがあります。 これらの各ディレクトリには、Goツールチェーンにとって特別な意味があります。

.
├── bin
├── pkg
└── src
  └── github.com/foo/bar
    └── bar.go

これらの各ディレクトリを見てみましょう。

$GOPATH/binディレクトリは、Goがgo installがコンパイルするバイナリを配置する場所です。 私たちのオペレーティングシステムは、$PATH環境変数を使用して、フルパスなしで実行できるバイナリアプリケーションを見つけます。 このディレクトリをグローバル$PATH変数に追加することをお勧めします。

たとえば、そこからプログラムを実行するために$GOPATH/bin$PATHに追加しない場合は、次のコマンドを実行する必要があります。

$GOPATH/bin/myapp

$GOPATH/bin$PATHに追加されると、次のように同じ呼び出しを行うことができます。

myapp

$GOPATH/pkgディレクトリは、Goがプリコンパイルされたオブジェクトファイルを格納する場所であり、その後のプログラムのコンパイルを高速化します。 通常、ほとんどの開発者はこのディレクトリにアクセスする必要はありません。 コンパイルで問題が発生した場合は、このディレクトリを安全に削除してGoで再構築できます。

srcディレクトリは、すべての.goファイルまたはソースコードを配置する必要がある場所です。 これを、Goツールが使用する$GOROOTにあるソースコードと混同しないでください。 Goアプリケーション、パッケージ、およびライブラリを作成するときに、これらのファイルを$GOPATH/src/path/to/codeの下に配置します。

パッケージとは?

Goコードはパッケージにまとめられています。 パッケージは、ディスク上の単一のディレクトリ内のすべてのファイルを表します。 1つのディレクトリには、同じパッケージの特定のファイルのみを含めることができます。 パッケージは、すべてのユーザー作成のGoソースファイルとともに、$GOPATH/srcディレクトリに保存されます。 さまざまなパッケージをインポートすることで、パッケージの解決を理解できます。

コードが$GOPATH/src/blue/redにある場合、そのパッケージ名はredである必要があります。

redパッケージのインポートステートメントは次のようになります。

import "blue/red"

GitHubやBitBucketなどのソースコードリポジトリに存在するパッケージには、インポートパスの一部としてリポジトリの完全な場所があります。

たとえば、次のインポートパスを使用して、https://github.com/gobuffalo/buffaloでソースコードをインポートします。

import "github.com/gobuffalo/buffalo"

したがって、このソースコードはディスク上の次の場所にあります。

$GOPATH/src/github.com/gobuffalo/buffalo

結論

この記事では、GOPATHを、Goがソースコード内に存在することを期待するフォルダーのセットとして、それらのフォルダーとは何か、およびそれらに何が含まれるかについて説明しました。 $GOPATH環境変数を設定して、その場所をデフォルトの$HOME/goからユーザーが選択した場所に変更する方法について説明しました。 最後に、Goがそのフォルダー構造内でパッケージを検索する方法について説明しました。

Go 1.11で導入されたGo Modulesは、GoワークスペースとGOPATHを置き換えることを目的としています。 モジュールの使用を開始することをお勧めしますが、企業環境などの一部の環境では、モジュールを使用する準備が整っていない場合があります。

GOPATHは、Goを設定する際の難しい側面の1つですが、一度設定すると、通常は忘れることができます。