GoLang: GOPATH を使用しない理由

初期のバージョンの Go を設定するには、いくつかの環境変数をセットアップする必要がありました。 しかし、多くのオンライン チュートリアルはまだこれらの変数に言及しており、混乱を招いています。

最近、Go モジュールと呼ばれる新しい機能がリリースされ、ついに GOPATH が不要となりました。 この投稿では、GOPATH とは何か、なぜ Go モジュールが好ましいのか、Go モジュールを使用するためにプロジェクトを設定する方法 (これは驚くほど簡単です) について説明します。

GOPATH は環境変数であり、プロジェクトのコンパイルに使用するすべてのソース ファイルの読み取りとダウンロードを行う場所を Go に知らせます。

  • GOPATH 変数 (デフォルトでは ~/go) が指すディレクトリ内に、他のプロジェクトが他の場所にあったとしても、Go プロジェクトを書くことが要求されます。 たとえば、URLが github.com/foo/bar の場合、$GOPATH/src/github.com ディレクトリを作成し、その中に新しいディレクトリを作成する必要があります。 foo/を作成し、その中に bar/ というディレクトリを作成します。 そして、bar/ ディレクトリの中に実際の git プロジェクトを置きます。
  • 使用しているパッケージのバージョンを追跡するための組み込みの方法は存在しません。 また、GOPATH は環境変数なので、ユーザーが OS の設定について少し知っている必要があり、特に初心者にはエラーが起こりがちです。

    Why should you use Go Modules?

    Go モジュールは、特定の環境変数の設定について述べた依存関係や、GOPATH と同様に特定のディレクトリにプロジェクトを配置するという要件に一切依存しません。

    また、レトロコンパチブルで、安全かつ簡単に使用できます。

    1. Go モジュールを使用するために既存のプロジェクトを移行するのに必要なコマンドは 1 つです。
    2. それは開発環境にのみ影響するので (GOPATH と同様)、実運用環境になんら影響を与えることはありません。

    Go モジュールの使い方を学ぶもうひとつの理由は、GOPATH は将来的に広く採用されなくなると思われるので、遅かれ早かれ学ぶ必要があるからです。

    注意点 1: GoLang バージョン 1.11 以上

    Go モジュールは GoLang バージョン 1.11 以上でしか動きません。 この投稿を書いた時点では、Ubuntu を含む一部の Linux ディストリビューションは、まだ GoLang 1.10 を使用しています。

    go version

    次のコマンドで、インストールした Go パッケージの現在のバージョンをテストできます:

    go version go1.11.2 linux/amd64

    このように出力するはずです:

    1.11.x 以下に表示されているなら、それをアンインストールしてから、以下の手順を行って必要な Go バージョンをインストールする必要があります。 また、以下の手順は Ubuntu およびその派生ディストロで動作するように意図されていることに注意してください。

    まず、ターミナルを開き、次のコマンドを実行します:

    # If you have already installed the Go package remove it:
    sudo apt-get remove --purge --auto-remove golang# Make sure your system is up-to-date:
    sudo apt-get update
    sudo apt-get -y upgrade# Download the Go 1.11 package and extract it:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz# Install it manually on your /usr/local directory:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc# Then close your terminal, open a new one and test if Go is at the correct version:
    which go # should output: /usr/local/go/bin/go
    go version # should output: go version go1.11.x linux/amd64 or similar
    • Go 1.11 パッケージ (またはそれ以降) をダウンロードし展開します:
      wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
      sudo tar -xvf go1.11.linux-amd64.tar.gz
    • それをあなたの /usr/local ディレクトリに手動でインストールしてください。
      sudo mv go /usr/local
      echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
    • 次に、ターミナルを閉じて、新しいターミナルを開き、Go が正しいバージョンであるかどうかをテストします:
      which go、出力されるはずです。 /usr/local/go/bin/go
      go version と出力されるはずです。 go version go1.11.x linux/amd64 またはそれに似たもの:
      sudo apt-get remove --purge --auto-remove golang
    • すでに Go パッケージをインストールしている場合は削除します:
      sudo apt-get update
      sudo apt-get -y upgrade
    • システムが最新であるか確認します:
      wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
      sudo tar -xvf go1.11.linux-amd64.tar.gz
    • あなたの /usr/local ディレクトリに手動でインストールします。
      sudo mv go /usr/local
      echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
    • 次に、ターミナルを閉じて、新しいターミナルを開き、Go が正しいバージョンであるかどうかをテストします:
      which go、出力されるはずです。 /usr/local/go/bin/go
      go version と出力されるはずです。 go version go1.11.x linux/amd64 or similar

    Caveat 2: Undo changes to GOPATH and GOROOT

    GOPATH や GOROOT のデフォルト値を変更した場合、その変更を削除することが賢明かも知れません。 これらは必要ありませんし、GOPATH の設定と Go モジュールの設定を混同することは混乱の元です。 具体的には、

    1. GOPATH のデフォルト値(設定されていない場合)は ~/go で、私が ~/go というディレクトリについて言及するときは、Go が使用するデフォルトディレクトリを意味します。 GOPATH を変更した場合、このディレクトリは別の場所にあるかもしれないので、混乱を避けるためにこれらの変更を取り消すことをお勧めします。 /usr/local.

    注意 3: ~/go ディレクトリを変更する必要はありません

    前述のように ~/go は GOPATH が設定されていないときに Go がファイルを読むためのデフォルトのディレクトリです。 しかし、これは GOPATH を使ってプロジェクトを作成しようと思っている場合にのみ違いが生じます。

    Go モジュールを使用したい場合、~/go ディレクトリを作成、編集、または読み込む必要さえありません。 もし存在しなければ、自動的に作成されますし、存在しても何も変更する必要はありません。

    したがって、このディレクトリを変更するように指示するチュートリアルの手順は、おそらく GOPATH の要件に言及しているので、無視してかまいません。

    また、現在このディレクトリ内に Go プロジェクトがあり、Go モジュールで動作させたい場合、古いバージョンの Go では go.mod ファイルがあっても GOPATH 内で Go Mod を無効にするので、外に移動させる必要があります。

    Go モジュールの使用

    Go モジュールの使用は基本的に次のコマンドを使用します:

    go mod init <your_projects_import_path>

    新しいプロジェクトを作成するには、新しいディレクトリ (~/go/ 以外の任意の場所) を作成し、モジュールとして初期化します、つまり、

    mkdir myProject/
    cd myProject
    go mod init github.com/myGithubName/myProject

    go mod init コマンドはプロジェクトのディレクトリに go.mod という新しいファイルを作成します。 このファイルには、プロジェクトのインポートパス (通常はリポジトリの URL) と、このプロジェクトで現在使用しているすべてのパッケージのリストが含まれます。

    それをテストするには、このディレクトリ内に次のコード行を含む新しい main.go ファイルを作成します:

    package mainimport "fmt"func main() {
    fmt.Println("Hello Go Modules")
    }

    それから go run コマンドを使ってテストします:

    go run main.go 

    期待どおり Hello Go Modules を出力するはずです。

    しかし私はすでに GOPATH を使うプロジェクトを持っています、どうすれば移行できますか?

    手順は似ています:

    1. プロジェクトのディレクトリを ~/go/
    2. 外のどこかに移動し、Go モジュールとして初期化します。どちらのコマンドも自動的に依存関係をダウンロードし、go.mod ファイルを更新します。 いいえ。

      1 つのプロジェクトで複数のモジュールを作成することは可能ですが、ほとんどの場合、これは不要です。 Go コードを整理するためのサブフォルダーが必要な場合は、モジュールではなく、パッケージを探してください。

      go.mod` と `go.sum` ファイルはどうすればいいですか。

      NPM の package.jsonpackage-lock.json と同様に、Go モジュールのコンセプトでは、依存関係のすべてのバージョンを追跡するためのいくつかのファイル、すなわち go.modgo.sum ファイルも作成します。

      この 2 つのファイルは go getgo test などのいくつかの go ツールによって自動的に管理されるため、編集する必要はありません。 プロジェクトの再現可能なビルドを実行するために、つまり、ローカルにあるすべての同じバージョンとパッケージでコンパイルするために必要なので、これらをコミットに追加することも良いアイデアです。 Go モジュールの使用は必須ではありませんが、ここまで読んでいただければ、GOPATH と比較して Go モジュールがいかに簡単で直感的であるかに気づかれたことでしょう。 また、Go モジュールだけが提供する機能があります。 再現可能なビルド。

      もし Go モジュールについてもっと詳しく知りたいなら、この投稿の短いバージョンか長いバージョンを読むことをお勧めします。 また、このトピックに関する素晴らしい投稿が Web 上にいくつかあるので、自分自身で調べることを強くお勧めします。 ハッピーコーディング!

コメントを残す

メールアドレスが公開されることはありません。