202

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

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

複数の方法を試しましたが、どうすればpackage1.go仕事をすることができますbinary1.gobinary2.go?

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

4

9 に答える 9

184

Go 依存関係管理の概要:

  • vgoあなたのバージョンが次の場合: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このため、大部分は手作業でdep作成vgoされました。


編集 1: 私の古い方法は機能しますが、もはや「正しい」方法ではありません。Go 1.6 でデフォルトで有効になっているベンダー機能、、vgoまたは(今のところ) を使用する必要があります。を参照してください。基本的に、ディレクトリ内に「外部」または「依存」パッケージを追加します。コンパイル時に、コンパイラはこれらのパッケージを最初に使用します。depvendor


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

binary1.go

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

したがって、現在のディレクトリ構造は次のようになります。

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

また、相対パス (少なくとも go 1.5 では) も機能することに注意してください。例えば:

import "../packageX"
于 2013-07-09T03:43:35.570 に答える
52

パッケージをモジュール化しようとしているのかもしれません。package1package2は、ある意味では同じパッケージの一部ですが、読みやすくするために、それらを複数のファイルに分割していると想定しています。

前のケースがあなたのものだった場合、それらの複数のファイルに同じパッケージ名を使用でき、同じファイルがあった場合と同じになります。

これは例です:

add.go

package math

func add(n1, n2 int) int {
   return n1 + n2
}

減算します。

package math

func subtract(n1, n2 int) int {
    return n1 - n2
}

donthing.go

package math

func donothing(n1, n2 int) int {
    s := add(n1, n2)
    s = subtract(n1, n2)
    return s
}

私は Go の専門家ではなく、これが StackOveflow での最初の投稿です。アドバイスがあれば、歓迎します。

于 2015-02-08T04:31:57.757 に答える