4

私は新しい golang 開発者です$GOPATHが、プロジェクトのルートに環境変数を設定する必要があるのはなぜでしょうか。

同時に複数のプロジェクトに取り組んでいる場合は、環境変数を毎回$GOPATH別の場所を指すように再設定する必要があります。

私のセットアップでは、に$GOPATH設定しました/Users/Projects/go/lib。これは、私のすべての golang プロジェクトの汎用ディレクトリです。

明確にするために、プロジェクトデータは次の場所に配置されます/Users/Projects/go/<Project Name>

とにかく$GOPATH(私が知る限り)すべてがサードパーティのライブラリをインストールするために使用されている$GOPATH場合、すべてのプロジェクトに1つのディレクトリを用意するのは安全ではないので、必要なすべてのサードパーティのライブラリは同じ lib ディレクトリにインストールされ、プロジェクトをコンパイルするときはいつでも、必要なライブラリを使用するだけです。

これは実際には悪いですか?なんで?

4

1 に答える 1

5

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

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

VSCode でのサポートがますます増えています。


2016 年 6 月: 1 つだけに依存する必要はありませんGOPATH(つまり、1 つのワークスペース)。

私の完全なGOPATH内容:

  • グローバル パス ()、などのすべてのユーティリティgoimports)、github.com/smartystreets/goconveyたとえば$HOME/go
  • ローカル パス (現在のプロジェクト用)、 my local srcpkgおよびbinになります。

それは 2 つのパスです。

export GOPATH=/path/to/myproject:$HOME/go

すべてのプロジェクトに 1 つの $GOPATH ディレクトリを使用するのは安全ではないので、必要なすべてのサードパーティ ライブラリが同じ lib ディレクトリにインストールされ、プロジェクトをコンパイルするたびに必要なライブラリが使用されます。

これは実際には悪いですか?なんで?

異なるプロジェクトでは同じライブラリの異なるバージョンが必要になる可能性があるため、私はそのような慣行は好きではありません。
そのためGOPATH、ビルド スクリプト (プロジェクトでバージョン管理されている) が設定するプロジェクトごとに 1 つ持っています。

私の go プロジェクトのクローンを作成すると、次のようになります。

  • そのgoプロジェクトに設定GOPATHします(そのプロジェクトに必要なサードパーティライブラリがインストールされ、vendorフォルダーに移動されるローカルパス)、
  • そのパスへのシンボリックリンクを作成します<myproject>/src/<myproject> -> ../..。これは、 go がinGOPATHのソースを見つけることを期待しているためです。myprojectsrc/<apackage>

その組織:

  • と互換性がありますgo get
  • global に存在する大量のグローバル ライブラリ/ユーティリティ内で失われるのではなく、必要な特定の依存関係がデフォルトでプロジェクト フォルダーにインストールされていることを確認しますGOPATH

私は持っている:

myproject
   mysource.go
   apackage
     othersource.go
   src
     myproject -> ../..
     vendor
        third-party packages

Windows では、典型的なビルド スクリプトは次のようになります。

λ more b.bat
@echo off
setlocal EnableDelayedExpansion
if not defined GOROOT (
        echo Environment variable GOROOT must be defined, with %%GOROOT%%\bin\go.exe
        exit /b 1
)

set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
set PATH=%PATH%;%GOROOT%/bin
set GOPATH=%~dp0;%HOME%/go

set prjname=%GOPATH:~0,-1%
for %%i in ("%prjname%") do set "prjname=%%~ni"
rem echo prjname='%prjname%'

if not exist src (
        mkdir src
)
if not exist src\%prjname% (
        mklink /J src\%prjname% %GOPATH%
)

pushd %~dp0
cd src\%prjname%
rem cd
go install
popd
endlocal

私の go プロジェクトを複製する人は、単純に「b」と入力します。

于 2016-06-19T07:52:57.753 に答える