34

作成するすべてのプロジェクトについて、export GOPATH={path_to_project}cd でプロジェクト ディレクトリに移動するたびに実行する必要があります。もっと簡単な方法があるはずです。特定のディレクトリの .bashrc または .bash_profile ファイルを作成して、そのプロジェクトの GOPATH を定義する方法はありませんか?

たとえば、2 つの go プロジェクト A と B があります。プロジェクト間を移動するときに再定義されない単一の GOPATH がある場合、両方のプロジェクトのバイナリが同じ場所に保存されます。さらに重要なことは、サードパーティ ライブラリのバイナリが同じ場所に保存されるため、プロジェクトごとに同じライブラリの複数のバージョンを維持する方法がありません。

ただし、プロジェクトごとに GOPATH を定義できれば、すべてのバイナリとサードパーティ ライブラリはプロジェクトに依存します。これは、他のほとんどの言語環境 (ruby rbenv、python vertiualenv など) でパッケージ管理を処理する一般的な方法のようです。

4

8 に答える 8

24

(2018 年第 2 四半期: vgo (現在は「モジュール」) projectでは、プロジェクト ベースのワークフローを支持して非推奨になる可能性があることに注意してください。これにより、2 年前に以下で提案GOPATHしていた手動のプロジェクト ベースを回避できます)GOPATH

Go 1.11 (2018 年 8 月) ではGOPATH、モジュールを使用してオプションにすることができます


Linux/Unix 環境用のHerbert Fischer ( )によるManage multiple GOPATH dirs with easyで表現された同様のアイデアがあります (上記のコメントで既に言及されている質問に基づいています)。hgfischer

~/.bashrc(または)に次のスニペットを含めて~/.bash_profile、シェル環境を でリロードするだけsource ~/.bashrcです。このスニペットは、入力されたディレクトリをスキャンするカスタマイズされたコマンドで
組み込みコマンドをオーバーライドするシェル関数を作成し、.cd.gopath

cd () {
    builtin cd "$@"
    cdir=$PWD
    while [ "$cdir" != "/" ]; do
        if [ -e "$cdir/.gopath" ]; then
            export GOPATH=$cdir
            break
        fi
        cdir=$(dirname "$cdir")
    done
}

.gopathこれで、必要なすべてのディレクトリにファイルを作成するだけGOPATHで、このディレクトリに入るたびに、再定義cdされた関数がGOPATH現在の環境の をこのディレクトリに設定します。


2017 の更新: 環境を変更したくない場合でも、Visual Studio Code (マルチプラットフォーム IDE であるvscodeGOPATH ) でそのプロジェクトのフォルダーを開き、拡張子 " Visual Studio Code に移動します」。src

その IDE では、次のことができます。

  • GOPATHと呼ばれる設定で、独自のグローバルを維持しますgo.toolsGopath
  • GOPATHと呼ばれる設定で現在の状況を推測しますgo.inferGopath

vscode ユーザー設定

そうすれば、VSCode はグローバルにツールのコレクションをインストールしますGOPATH(VSCode の外部でも使用できるようにします)。「 Go 拡張機能が依存する Go ツール
」を参照してください: , , , ...godepgolintgurugodoc

それでも、あなたGOPATHのプロジェクトは src の親フォルダーになります。

ローカルGOPATH

これは、IDE からプロジェクトをコンパイル/インストールするときに機能します。
コマンドラインから実行したい場合は、上記の元の回答が引き続き適用されます。

于 2015-02-08T13:44:26.013 に答える
10

autoenvのようなツールを使用cdして、特定のディレクトリに入ったときに自動的に実行されるスクリプトを設定できます。

目的に合わせて、サンプル/happy/go/path/yay/.envファイルは次のようになります。

export GOPATH="/happy/go/path/yay"
export PATH="$GOPATH/bin:$PATH"
于 2013-07-24T00:37:22.760 に答える
5

現在のディレクトリから適切な GOPATH を推測できるスクリプトを作成し、goコマンドにエイリアスを付けて最初にこのスクリプトを呼び出します。たとえば、非常に単純な実装です。

#!/bin/bash
# infer-gopath.sh

pwd

次に、.bash_aliases (またはエイリアスを保持する場所) で:

alias go='GOPATH=$(infer-gopath.sh) go'

これは、コマンドの呼び出しのためだけに出力を設定GOPATHするため、シェルに永続的な影響を与えることはありません。infer-gopath.shgo

于 2013-07-22T06:30:39.527 に答える
5

これはあまり巧妙ではないことはわかっていますが、src、pkg、および bin フォルダーがある go プロジェクトのベース ディレクトリに移動するだけで、次のように入力できることがわかりました。

export GOPATH=$(pwd)

それはすべて良いです!

于 2018-02-17T17:24:02.437 に答える
1

コメントすることはできませんが、@joshlf からの回答を構築するために :::

go-- 私の方法では、余分GOPATHなファイルを処理/作成する必要はありません:

alias go='GOPATH=$(echo $(pwd)) go'

乾杯

于 2016-04-08T20:44:48.097 に答える
0

上記の gopath() 回答の根性は好きですが、(a) コマンドGOPATH専用のセットを持つのは好きではなく ( govim プラグインなどで使用します)、(b) 覚えておく必要があるのも好きではありません:)gopathの代わりに入力してくださいgo

これは私が最終的に my に追加したものです~/.bash_profile:

export GOPATH="... a default path ..."
function cd() {
  builtin cd $@ &&
  export GOPATH="$(
    ( while [[ $PWD != / && $(basename $PWD) != go ]]; do
        cd ..
      done
      if [[ $PWD == / ]]; then
        echo $GOPATH
      else
        echo $PWD
      fi
    ))"
}

(また、このブログ投稿で要件について少し追加の議論を加えて上記を書き上げました)

于 2014-07-21T00:56:50.707 に答える