web-dev-qa-db-ja.com

別のモジュールで「GOPATH」の外にあるモジュールを使用する方法は?

このコマンド「go mod init database」を使用して、「database」フォルダーの「GOPATH」の外部で個人用モジュールとしてライブラリーを作成しましたが、わかりません。

  • 使用方法/ importこのモジュールを別のモジュールで使用するには?

OS:Windows 7、Go:v1.11

17
samadadi

最も簡単ですぐに使えるソリューションは、databaseパッケージ/モジュールをVCS(たとえばgithub.com)に配置することです。これにより、他のパッケージ(他のモジュール内)がインポートすることで簡単に参照できますそれが好きです:

import "github.com/someone/database"

そうすれば、go.modファイルを手動で操作する必要さえありません。すべてがgoツールで処理されます。この依存関係を自動的に認識して解決し、必要なパッケージをダウンロードしてインストールします。また、go.modも自動的に更新されます。

完全にローカルディスクにとどまる

VCSを使用したくない場合(たとえば、単に実験をしている場合や、まだ何を使用するか決めていない場合)、それでも実行できます。 howの詳細は、公式の Go Wiki:ローカルファイルシステムでVCSの完全に外部で作業できますか?

したがって、databaseの外部にGOPATHフォルダーを作成し、その中にモジュールを作成しました。そして、別のモジュールを作成し、mainと呼び、このdatabaseパッケージを使用したいとします。

あなたがしなければならないことは:

  • mainモジュールのgo.modは、databaseパッケージを「要件」としてリストする必要があります。 databaseパッケージに一時的なVCS​​名を付けます:

    require (
        example.com/me/database v0.0.0
    )
    
  • 使用した完全なパッケージ名は単なる一時的な/空想上の名前であるため、このパッケージの場所をgoツールに伝える必要があります。 replaceディレクティブを使用して、このdatabaseパッケージがローカルディスク上のフォルダーを指すようにします。絶対パスと相対パスを使用できます:

    replace example.com/me/database => ../database
    

そして、それだけです。

実施例

実際の例を見てみましょう。 prettyモジュールを作成しましょう。 2つのファイルを含むprettyフォルダーを作成します。

pretty.go:

package pretty

import "fmt"

func Pretty(v ...interface{}) {
    fmt.Println(v...)
}

go.modgo mod init prettyを実行することで作成できます):

module pretty

次に、別のメインモジュールを作成しましょう。 osinfフォルダーの隣にフォルダーpretty(何でも構いません)を作成しましょう。その中の2つのファイル:

osinf.goprettyパッケージ/モジュールを使用することに注意してください。"example.com/me/pretty"でインポートします):

package main

import "example.com/me/pretty"

func main() {
    pretty.Pretty("hi")
    pretty.Pretty([]int{1, 3, 5})
}

go.mod:

module main

require example.com/me/pretty v0.0.0

replace example.com/me/pretty => ../pretty

そして、それだけです。

osinfフォルダーでgo run osinf.goを実行すると、出力は次のようになります。

hi
[1 3 5]
34
icza