47

親ディレクトリからの相対インポートを行うにはどうすればよいですか?

からmeme/cmd/meme:

import "../../../meme"

これにより、あいまいなエラーが発生します。

matt@stanley:~/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme$ go get bitbucket.org/anacrolix/meme/cmd/meme

can't load package: /home/matt/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme/main.go:8:2: local import "../../../meme" in non-local package

matt@stanley:~/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme$ echo $GOPATH

/home/matt/gopath

親ディレクトリからローカルにインポートするにはどうすればよいですか?

4

4 に答える 4

51

編集:相対インポート パスは、Go で使用する方法ではありません。ドキュメントが不足していることは、相対パスの人気について何かを示しており、それらを使用する理由がわかりません。Go が推奨するコード編成はかなりうまく機能します。すべてのパッケージには一意のインポート パスが必要であり、同じインポート パスを使用してどこにでもインポートする必要があります。

のようなパッケージがgithub.com/ha/doozerd/peer その隣人をどのようにインポートするかを見てください。これは Go プロジェクトでは一般的な方法であり、私は何度も見てきました。パッケージcamlistore.org/pkg/auth(これもGitHubcamlistore.org/pkg/netutilにあります。Go の主な作成者の 1 人によって書かれています) はフル パスでインポートされます。

同じプロジェクトにコマンドとライブラリの両方がある場合でも、このアプローチは機能します。最初の質問では、賢明にもベスト プラクティスを尋ねました。この件に関するベストプラクティスを説明するために最善を尽くしました。


Go ではインポート パスを相対にすることはできません。Go プロジェクトを編成する上で欠かせない、How to Write Go Code を読むことをお勧めします。簡単な概要は次のとおりです。

~/goGo 開発用のようなディレクトリを作成します。次に、次のように言います。

$ export GOPATH=~/go
$ mkdir $GOPATH/{src,bin,pkg}

$GOPATH/srcは、 でダウンロードしたものも含め、すべての Go パッケージのソース コードを保持しますgo get。コンパイルの出力を保持しますbinpkgパッケージ名を持つパッケージmainはコマンドであり、実行可能なバイナリを生成し、$GOPATH/bin. 他のパッケージはライブラリであり、それらのコンパイルされたオブジェクト ファイルは に置かれ$GOPATH/pkgます。

コードを に入れると、$GOPATH/src/matt/memeでインポートできますimport "matt/meme"。パッケージ名にはプレフィックスを使用し、標準ライブラリには短いパッケージ名を残すことをお勧めします。そのため、$GOPATH/src/matt/meme代わりにを使用しました$GOPATH/src/meme

この考えに基づいてコードを編成します。

于 2012-05-21T15:23:24.217 に答える
20

質問に追加していただきありがとうございます。最初に答え、次にいくつかの説明。私はあなたのコードを構築しました、

  1. あなたが持っていたのと同じように、手に入れてください。(エラーメッセージは無視しました。)
  2. 必要に応じて、インポート行main.goを「../../../meme」に戻します。
  3. (未使用の変数を含むコードを少しコメントアウトします。)
  4. 次に、meme/cmd/meme ディレクトリで、go run main.goまたはgo build main.go機能しました。

go install works と言ったとき、私は以前のコメントで間違っていました。私はビルドすると言ったはずです。

ただし、重要なのは、それgo buildだけでは機能しないということです。と入力する必要がありますgo build main.go。これは、go コマンドが「非ローカル パッケージでのローカル インポート」を許可しないためです。ここで仕様がほとんど役に立たないことは正しいです。「ImportPath の解釈は実装に依存する」と言って、イタズラします。現在の実装動作はCL 5787055で設定されており、その後Go-nutsで長々と議論されました。

「ローカル」とは、ファイル システムの相対パスで示されることを意味します。明らかに .. で始まる相対パスはローカルなので、goメインをローカル パッケージとして扱うようにコマンドを取得するだけです。を入力したときは明らかにこれを行いませんが、入力go buildしたときは行いますgo build main.go

于 2012-05-22T19:29:36.280 に答える
3

コンパイラ、リンカ、...を直接手動で使用する場合、相対インポートがサポートされます。'go'(ビルド)ツールは同じものをサポートしていません(Javaなどに匹敵します)。

于 2012-05-21T15:17:30.633 に答える