web-dev-qa-db-ja.com

Goビルド:「パッケージが見つかりません」(GOPATHが設定されていても)

GOPATHが適切に設定されていても、自分のパッケージを見つけるために「ビルドを実行」または「実行」を取得することはできません。何が間違っていますか?

$ echo $GOROOT
/usr/local/go

$ echo $GOPATH
/home/mitchell/go

$ cat ~/main.go
package main
import "foobar"
func main() { }

$ cat /home/mitchell/go/src/foobar.go
package foobar

$ go build main.go
main.go:3:8: import "foobar": cannot find package
102
MitchellSalad

foobar.goソースファイルがfoobarというディレクトリにないため、機能しません。 go buildおよびgo installは、ソースファイルではなくディレクトリの一致を試みます。

  1. $GOPATHを有効なディレクトリに設定します(例: export GOPATH="$HOME/go"
  2. foobar.go$GOPATH/src/foobar/foobar.goに移動すると、ビルドは正常に機能するはずです。

追加の推奨手順:

  1. $GOPATH/bin$PATHに追加する方法:PATH="$GOPATH/bin:$PATH"
  2. main.go$GOPATH/srcのサブフォルダーに移動します。 $GOPATH/src/test
  3. go install testは、testを端末に入力して呼び出すことができる実行可能ファイルを$GOPATH/binに作成する必要があります。
129
fasmat

編集:GOPATHを意味していたので、 fasmatanswer (vovoted)を参照してください

パッケージを見つける方法 」で説明したように、パッケージxxxをディレクトリxxxに配置する必要があります。

Go言語仕様 を参照してください:

package math

同じPackageNameを共有するファイルのセットは、パッケージの実装を形成します。
実装では、パッケージのすべてのソースファイルが同じディレクトリに存在する必要がある場合があります。

コード編成 言及:

パッケージ「widget」をインポートするプログラムをビルドするとき、goコマンドはGoルート内でsrc/pkg/widgetを探し、パッケージソースが見つからない場合はsrc/widget各ワークスペース内で順番に。

(「ワークスペース」はGOPATHのパスエントリです。その変数は 'src, bin, pkg'の複数のパスを参照できます)


(元の答え)

また、「 Goコードの記述方法 」に示すように、 GOPATHGOROOTではなく〜/ goに設定する必要があります。

Goパスは、インポートステートメントを解決するために使用されます。 go/buildパッケージに実装され、文書化されています。

GOPATH環境変数は、Goコードを探す場所をリストします。
Unixでは、値はコロンで区切られた文字列です。
Windowsでは、値はセミコロンで区切られた文字列です。
プラン9では、値はリストです。

それはGOROOTとは異なります:

Goバイナリディストリビューションは、/usr/local/go(またはWindowsの場合はc:\Go)にインストールされることを前提としていますが、別の場所にインストールすることもできます。
これを行う場合、Goツールを使用するときにGOROOT環境変数をそのディレクトリに設定する必要があります。

9
VonC

TL; DR:Goの規則に従ってください! (レッスンは難しい方法を学びました)、古いgoバージョンを確認し、 remove それらを確認します。最新のインストール。

私にとって解決策は異なっていました。共有Linuxサーバーで作業し、GOPATHおよびその他の環境変数を数回確認した後、まだ機能しませんでした。 「パッケージが見つかりません」や「認識されないインポートパス」など、いくつかのエラーが発生しました。 golang.orgninstall 部分を含む)の指示による this ソリューションで再インストールを試みた後、まだ問題が発生しました。

アンインストールされていない古いバージョン(go versionを実行してからwhich goを再度実行します... DAHH)が this の質問に到達し、最終的に解決されたことに気づくまでしばらく時間がかかりました。

3
Moshisho