177

適切に設定したにもかかわらずGOPATH、「go build」または「go run」で自分のパッケージを見つけることができません。私は何を間違っていますか?

$ 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
4

13 に答える 13

185

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

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

追加の推奨手順:

  1. あなたに追加$GOPATH/binしてください$PATHPATH="$GOPATH/bin:$PATH"
  2. main.goのサブフォルダに移動し$GOPATH/srcます。$GOPATH/src/test
  3. go install test$GOPATH/binターミナルに入力して呼び出すことができる実行可能ファイルを作成する必要がありtestます。
于 2012-11-04T22:26:58.177 に答える
30

ディレクトリとパッケージ名を一致させる必要があることについては、受け入れられた答えはまだ正しいですが、GOPATH を使用する代わりに Go モジュールを使用するように移行する必要があります。この問題に遭遇した新しいユーザーは、時代遅れになった GOPATH の使用についての言及 (私もそうでした) について混乱するかもしれません。そのため、この問題を解決し、Go モジュールを使用する際にこの問題を回避するためのガイダンスを提供します。

すでに Go モジュールに精通していて、この問題が発生している場合は、見落としたり忘れたりしやすい Go 規則のいくつかをカバーする以下のより具体的なセクションにスキップしてください。

このガイドでは、Go モジュールについて説明しています: https://golang.org/doc/code.html

Go モジュールを使用したプロジェクト編成

その記事で説明されているように、Go モジュールに移行したら、次の説明に従ってプロジェクト コードを編成します。

リポジトリには 1 つ以上のモジュールが含まれます。モジュールは、一緒にリリースされる関連する Go パッケージのコレクションです。通常、Go リポジトリには、リポジトリのルートにある 1 つのモジュールのみが含まれます。そこにある go.mod という名前のファイルは、モジュール パス (モジュール内のすべてのパッケージのインポート パスのプレフィックス) を宣言します。モジュールには、その go.mod ファイルを含むディレクトリとそのディレクトリのサブディレクトリ (別の go.mod ファイル (存在する場合) を含む次のサブディレクトリまで) にパッケージが含まれます。

各モジュールのパスは、そのパッケージのインポート パスのプレフィックスとして機能するだけでなく、go コマンドがモジュールをダウンロードするために参照する場所も示します。たとえば、モジュール golang.org/x/tools をダウンロードするために、go コマンドはhttps://golang.org/x/tools (詳細はこちら) で示されるリポジトリを参照します。

インポート パスは、パッケージのインポートに使用される文字列です。パッケージのインポート パスは、モジュール内のサブディレクトリと結合されたモジュール パスです。たとえば、モジュール github.com/google/go-cmp には、ディレクトリ cmp/ にパッケージが含まれています。そのパッケージのインポート パスは github.com/google/go-cmp/cmp です。標準ライブラリのパッケージには、モジュール パスのプレフィックスがありません。

次のようにモジュールを初期化できます。

$ go mod init github.com/mitchell/foo-app

コードをビルドするために、コードを github.com に配置する必要はありません。ただし、最終的に公開されるかのようにモジュールを構成することをお勧めします。

パッケージを取得しようとしたときに何が起こるかを理解する

パッケージまたはモジュールを取得しようとするとどうなるかについて説明している素晴らしい記事がここにあります : https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16既に Go モジュールを使用している場合に、このエラーが発生する理由を理解するのに役立ちます。

インポートされた関数がエクスポートされていることを確認します

別のファイルから関数にアクセスできない場合は、関数をエクスポートしたことを確認する必要があることに注意してください。私が提供した最初のリンクで説明したように、関数は、エクスポートして他のパッケージにインポートできるようにするには、大文字で始まる必要があります。

ディレクトリの名前

もう1つの重要な詳細(受け入れられた回答で述べたように)は、ディレクトリの名前がパッケージの名前を定義するものであるということです。(パッケージ名はディレクトリ名と一致する必要があります。) ここで例を確認できます : https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74ccつまり、メソッドを含むファイルmain(つまり、アプリケーションのエントリ ポイント) は、この要件から免除されています。

例として、次のような構造を使用すると、インポートで問題が発生しました。

/my-app
├── go.mod
├── /src
   ├── main.go
   └── /utils
      └── utils.go

utilsコードをmainパッケージにインポートできませんでした。

ただし、main.go以下に示すように、独自のサブディレクトリに配置すると、インポートは正常に機能しました。

/my-app
├── go.mod
├── /src
   ├── /app
   |  └── main.go
   └── /utils
      └── utils.go

その例では、go.mod ファイルは次のようになります。

module git.mydomain.com/path/to/repo/my-app

go 1.14

への参照を追加した後に main.go を保存するutils.MyFunction()と、IDE は次のようにパッケージへの参照を自動的に取り込みました。

import "git.mydomain.com/path/to/repo/my-app/src/my-app"

(私は Golang 拡張機能を備えた VS Code を使用しています。)

インポート パスにパッケージのサブディレクトリが含まれていることに注意してください。

プライベートレポの扱い

コードがプライベート リポジトリの一部である場合は、git コマンドを実行してアクセスを有効にする必要があります。そうしないと、他のエラーが発生する可能性があります。 repositories-dfe795068db4 この問題は、ここでも議論されています:プライベート リポジトリを「取得」する適切な方法は何ですか?

于 2020-07-15T01:20:45.700 に答える
14

go env GO111MODULE をオフに設定して、この問題を解決しました

go env -w  GO111MODULE=off

注: GO111MODULE=off を設定すると、最新の GO モジュール機能がオフになります。

参照: GO111MODULE がどこにでもある理由、および Go モジュールに関するすべて (Go 1.17 で更新)

Go 1.16 を使用した GO111MODULE

Go 1.16 の時点で、デフォルトの動作は GO111MODULE=on です。つまり、古い GOPATH の方法を使い続けたい場合は、Go モジュール機能を使用しないように Go を強制する必要があります。

export GO111MODULE=off

于 2020-08-23T10:24:16.910 に答える
10

編集:あなたはGOPATHを意味していたので、fasmat答えを見てください(賛成)

パッケージを検索するにはどうすればよいですか?xxx 」で述べたように、パッケージをディレクトリに配置する必要がありますxxx

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

package math

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

コード組織は次のように述べています。

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

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


(元の回答)

また、「 Go コードの書き方」に示されているようにGOPATH、 ではなく ~/go に設定する必要があります。GOROOT

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

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

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

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

于 2012-11-03T22:30:36.607 に答える
3

TL;DR: Go の規約に従ってください。(苦労して学んだ教訓)、古い go バージョンを確認して削除します。最新のものをインストールします。

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

アンインストールされていない古いバージョンがまだあることに気付くのに少し時間がかかりました(もう一度実行していgo versionますwhich go... DAHH)。これにより、この質問にたどり着き、最終的に解決されました。

于 2018-01-31T07:43:04.487 に答える
2

GOPATH などを編集せずに、私の場合は次のように動作しました。


/app
├── main.go
├── /utils
    └── utils.go

必要に応じてパッケージをインポートします。これは、アプリのパスに関連していないため、直感的ではない可能性があります。パッケージ パスにもアプリを追加する必要があります。

main.go:

package main

import(
   "app/util"  
)

app ディレクトリにいるので、次を実行します。

go mod init app

go get <package/xxx>

go build main.go / go run main.go

準備万端です。


GOPATH =/home/go

appPath =/home/projects/app

適切なgo.modgo.sumを作成しますgo mod init app(以前の古いものを削除)

その後、不足しているパッケージなどのすべての依存関係をgo get github.com/example/package.

于 2021-05-22T20:00:32.403 に答える
-8

goの絶対ディレクトリを「パス」に追加しようとしましたか?

export PATH=$PATH:/directory/to/go/
于 2012-11-04T08:53:57.373 に答える