web-dev-qa-db-ja.com

Goワークスペースのベストプラクティスは何ですか?

私はGoについて学び、既存のコードを読んで「他の人がどのようにやっているか」を学んでいます。そうすることで、特にプロジェクトの依存関係に関連するgo "workspace"の使用は、至る所にあるようです。

さまざまなGoプロジェクトでの作業中に単一または複数のGoワークスペース(つまり、$ GOPATHの定義)を使用する場合の一般的なベストプラクティスは何ですか(またはありますか)?私のすべてのプロジェクトのコードの中央リポジトリのような単一のGoワークスペースがあることを期待しているのでしょうか、またはこれらのプロジェクトのそれぞれに取り掛かるときに明示的に分割して$ GOPATHをセットアップする必要があります(= python virtualenv)?

44
heckj

持っている方が簡単だと思います$GOPATHプロジェクトごと。これにより、異なるプロジェクトに対して同じパッケージの異なるバージョンを作成し、必要に応じてパッケージを更新できます。

中央リポジトリーでは、パッケージを更新するときに関連のないプロジェクトを壊す可能性があるため(パッケージの更新に重大な変更や新しいバグがある場合)、パッケージを更新することは困難です。

31
laurent

以前は複数のGOPATHを使用していました-実際には数十。プロジェクト間の切り替えと依存関係の維持は、1つのワークスペースで有用な更新を取得するために他のワークスペースで実行する必要があり、時には忘れて頭を悩ませて、その依存関係が1つのプロジェクトで機能する理由を疑問視したため、はるかに困難でしたしかし、別のものではありません。フィアスコ。

私は今one GOPATHを持っているだけで、実際にすべての開発プロジェクト-Goかどうか-をその中に配置しました。中央のワークスペースが1つあれば、各プロジェクトを独自のgitリポジトリ(src/<whatever>)そして必要に応じて依存関係を管理するためにgitブランチを使用します(実際にはめったにありません)。

私の推奨事項:ワークスペースを1つだけ使用するか、2つ使用することをお勧めします(たとえば、推奨されるパッケージパスの命名規則を使用すれば、作業コードと個人コードをさらに分離する必要がある場合など)。

28
Matt

すべてのプロジェクトで1つのGOPATHを使用すると非常に便利ですが、これは自分の個人的なプロジェクトの場合にのみ当てはまります。

依存関係をフリーズするために各GOPATHのディレクトリツリーでgitサブモジュールを使用しているため、維持している本番システムごとに個別のGOPATHを使用しています。

だから、次のようなもの:

~/code/my-project
- src
  - github.com
    + dependency-one
    + dependency-two
    - my-org
      - my-project
        * main.go
        + package-one
        + package-two
- pkg
- bin

GOPATHを〜/ code/my-projectに設定すると、グローバル依存関係を使用する代わりに、そのプロジェクト内のdependency-oneとdependency-twoのgitサブモジュールが使用されます。

6
Collin Van Dyck

私の会社では、複数のGOPATHsを非常に簡単に管理できるように Virtualgo を作成しました。手動で処理する場合と比べて、いくつかの利点があります。

  • プロジェクトにGOPATHすると、正しいcdに自動的に切り替わります。
  • それはベンダーツールとうまく統合します
  • また、パスに新しいGOBINを設定するため、そこにインストールされている実行可能ファイルを使用できます。
  • 元のGOPATHがバックアップとして残っています。パッケージがプロジェクト固有のワークスペースで見つからない場合は、メインのGOPATHを検索します。
5
JelteF

GOPATH$HOME/goまたは同様の値に設定して作業を開始すると、すべてがそのまま機能し、非常に簡単です。

さまざまな鮮度の状態で共通の依存関係が多数ある多くのプロジェクトに対して、多数のbin dirを使用してGOPATHsを多数作成すると、当然のことながら、状況が難しくなります。それはただの作業です。

場合によっては、いくつかのものを分離する必要がある場合は、別のGOPATHを作成してその状況を処理できます。

しかし、一般的に、自分がより多くの仕事をしていることに気づいた場合、それは多くの場合、物事を難しくすることを選択しているためです。

過去4年間に蓄積した100のプロジェクトに近づいているはずです。私はほとんどいつもGOPATHで作業しています。これは私のコンピューターでは$HOME/goです。

5
Dustin

envirius(ユニバーサル仮想環境マネージャー) を試してください。 goの任意のバージョンをコンパイルし、それに基づいて任意の数の環境を作成できます。 $GOPATH/$GOROOTは特定の環境ごとに異なります。

さらに、混合言語(たとえば、1つの環境でのpythongo)を含む環境を作成できます。

5
shorrty

私にとっては、1つのワークスペース+ godep が最適です。

2
Fedir Tsapana

direnvパッケージを試してみてください。

https://direnv.net/

0
sjas

私はKISS-1つのGOPATH、2つのgoパスに従います:

export GOPATH = $ HOME/go:$ HOME/development/go

そうすれば、サードパーティのものが中央に配置され(パッケージのインストールでは、デフォルトで最初のパスエントリが使用されます)、プロジェクトを2番目のパスエントリに柔軟に移動できます。

0
ibisum