2016-06-19 18 views
3

私は新しいgolang開発者です。私はなぜ$GOPATHという環境変数が私のプロジェクトのルートに設定される必要があるのだろうかと思います。

複数のプロジェクトを同時に処理している場合は、別の場所を指すように環境変数$GOPATHを再設定するたびに再設定する必要があります。

私の設定では、$GOPATH/Users/Projects/go/libに設定されています。これは私のゴランプロジェクトの総称ディレクトリです。ただ、明確にする

:プロジェクトデータはとにかく全て$GOPATHは(私の知る限りでは)に使用サードパーティのライブラリをインストールすることですされている場合は、それが1つの$GOPATHディレクトリを持つことは安全ではありません/Users/Projects/go/<Project Name>

に置かれています私のすべてのプロジェクトでは、必要なサードパーティのライブラリはすべて同じlibディレクトリにインストールされます。プロジェクトをコンパイルするときは、必要なlibsを使用するだけです。

これは実際には悪いですか?どうして?

+0

プロジェクトを同じディレクトリに置くことができます。問題はない。 – ameyCU

+1

これは多くのことを明確にします - https://golang.org/doc/code.html $ GOPATHは "go"ワークスペースとみなされ、すべてのプロジェクトは "src"サブディレクトリ。 $ GOPATHの使用を明らかにする多くのリソースがあります。 – Shikloshi

+0

基本的に 'GOPATH'はShikloshiが述べたように" Go workspace "を参照していますので、[Go workspacesの良いベストプラクティスは何ですか?](https://stackoverflow.com/q/20722502/539810)が興味深い読む。それらの回答の理由が異なると、さまざまな回答があります。個人的に私はone-workspaceスキームを使用しますが、明らかにそれはプロジェクトの要件に応じて変わる可能性があります。 –

答えて

3

のみ 1つをGOPATH(つまりone workspace)に頼る必要はありません。

私のフルGOPATHが含まれています:

  • グローバルパス私の現在のプロジェクトのために例えば$HOME/goで、github.com/smartystreets/goconvey、...)、、
  • goimportsのようなすべてのユーティリティのための)ローカルパスを()どこで私のローカルsrcpkgbinになります。二つの経路である

:必要なすべてのサードパーティのライブラリが同じlibディレクトリにインストールされているので、

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

は、すべての私のプロジェクトのために1つの$ GOPATHディレクトリを持っている、それは安全ではありません私がプロジェクトをコンパイルするときは、必要なライブラリだけを使用します。

これは実際には悪いですか?どうして?異なるプロジェクトが同じライブラリの異なるバージョンが必要になる場合がありよう

私は、その練習が好きではありません。
私はプロジェクトごとに1つのGOPATHを持っており、私のビルドスクリプト(プロジェクトでバージョン管理されている)は私のために設定されています。

私は私の行くプロジェクトのクローンを作成すると、I:

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

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

    グローバルGOPATHにあります。

私が持っている:Windowsでは

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

を、一般的なビルドスクリプトは次のようになります。私の行くプロジェクトをクローン

λ 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 

誰もが単に 'b' と入力します。

関連する問題