web-dev-qa-db-ja.com

goモジュール内のローカルパッケージへのアクセス(go 1.11)

Goの新しいモジュールシステムを試していますが、ローカルパッケージにアクセスできません。次のプロジェクトは、gopath以外のデスクトップ上のフォルダーにあります。

私のプロジェクト構造は次のようになります。

/
  - /platform
      - platform.go
  - main.go
  - go.mod

// platform.go
package platform

import "fmt"

func Print() {
    fmt.Println("Hi")
}

// main.go
package main

import "platform"

func main() {
    platform.Print()
}

go build main.go教えて

cannot find module for path platform
32
David Alsh

これらの問題をすぐに処理できるgoツールチェーンを使用することを強くお勧めします。 vscode-goプラグインを使用したVisual Studio Codeは非常に便利です。

ここでの問題は、Goがimportステートメントの$GOPATH/srcまたはmoduleに関して相対パスを必要とすることです。 GOPATHのどこにいるかに応じて、インポートパスにもそれを含める必要があります。この場合、importステートメントにはgo.modのgoモジュールパスを含める必要があります

GOPATH

プロジェクトがここにあると仮定します。

$GOPATH/src/github.com/myuser/myproject

インポートパスは次のとおりです。

import "github.com/myuser/myproject/platform"

VGO

Go.modファイルが次のとおりであると仮定します。

module example.com/myuser/myproject

インポートパスは次のとおりです。

import "example.com/myuser/myproject/platform"
24

この最初のmodulespackagesのコレクションです。 Go 11では、次のように go modules を使用します。

両方のパッケージが同じプロジェクトにある場合は、次のことを行うことができます:go.mod

module github.com/userName/moduleName

そしてmain.goの中に

import "github.com/userName/moduleName/platform"

ただし、それらが別々のモジュール、つまり異なる物理パスであり、たとえばgithubにリモートで公開せずにローカルpackagesをインポートしたい場合は、replaceディレクティブを使用してこれを実現できます。

モジュール名github.com/otherModuleおよびplatformを指定すると、その中にある唯一のパッケージです。メインモジュールのgo.modに次の行を追加します。

module github.com/userName/mainModule

require "github.com/userName/otherModule" v0.0.0
replace "github.com/userName/otherModule" v0.0.0 => "local physical path to the otherModule"

注:パスはモジュールのルートディレクトリを指す必要があり、絶対パスまたは相対パスを指定できます。

main.go内で、platformからotherModuleなどの特定のパッケージをインポートするには:

import "github.com/userName/otherModule/platform"

Golangモジュールの 穏やかな紹介

22