1. ホーム
  2. go

[解決済み】gopathを使わずにローカルパッケージをインポートする方法

2022-04-14 23:28:06

質問

私は GOPATH しかし、私が直面しているこの問題では役に立ちません。私は、プロジェクトに固有のパッケージを作成できるようにしたいのです。

myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go

複数の方法を試しましたが、どうすれば package1.go で動作するように binary1.go または binary2.go といった具合でしょうか。

例えば、次のようなことができるようにしたい。 import "package1" を実行することができます。 go build binary1.go でパッケージが見つからないというエラーが発生することなく、すべて正常に動作します。 GOROOT または GOPATH . このような機能が必要な理由は、大規模なプロジェクトのためです。複数の他のパッケージを参照したり、それらを1つの大きなファイルに保存したりする必要がないようにしたいのです。

どのように解決するのですか?

依存関係管理の概要に移動します。

  • vgo もしあなたのgoのバージョンが x >= go 1.11
  • dep または vendor もしあなたのgoのバージョンが go 1.6 >= x < go 1.11
  • goのバージョンがある場合は手動で。 x < go 1.6

編集3:Go 1.11には、以下の機能があります。 vgo となります。 置き換える dep .

を使用する場合 vgo を参照してください。 モジュール のドキュメントを参照してください。以下、TLDR。

export GO111MODULE=on
go mod init
go mod vendor # if you have vendor/ folder, will automatically integrate
go build

このメソッドは go.mod をプロジェクトディレクトリにコピーします。そして、プロジェクトをビルドする際に go build . もし GO111MODULE=auto が設定されている場合、プロジェクトは $GOPATH .


編集2:ベンダリングの方法はまだ有効で、問題なく動作します。 vendor は、主に手作業で行われるため、この depvgo が作成されました。


編集1:私の古い方法は機能しますが、それはもはや正しい方法とは言えません。あなたは ベンダー の能力を向上させることができます。 vgo または dep (現時点では) Go 1.6 でデフォルトで有効になっています。 見る . 基本的に、quot;外部または依存するパッケージを vendor コンパイル時に、コンパイラはこれらのパッケージを最初に使用します。


見つかりました。でローカルパッケージのインポートができました。 GOPATH のサブフォルダを作成することで package1 でインポートし import "./package1"binary1.gobinary2.go のようなスクリプトを作成します。

バイナリ1.go

...
import (
        "./package1"
      )
...

というわけで、現在の私のディレクトリ構成は以下のようになっています。

myproject/
├── binary1.go
├── binary2.go
├── package1/
│   └── package1.go
└── package2.go

また、(少なくとも go 1.5 では)相対パスも機能することに留意する必要があります。

import "../packageX"