私のGoプロジェクトでは、いくつかの一般的な機能をメインプロジェクトとは別のGoモジュールに分割したいと思います。私はこれをGOPATHの外で行って、goの将来に対応しています。モジュールをGitHubや他の場所に公開したくありません。
このモジュールをメインプロジェクトにインポートしようとすると、次のような結果になります。
cannot find module for path X
モジュールのフォルダーでgo mod init X
を実行しました。 go.mod
ファイルの内容は次のとおりです。
module X
このモジュールのビルドまたはインストールは何もしないようです。 $GOPATH/pgk/mod
にその兆候は見つかりませんでした。
さまざまなインポートステートメントを試しました。
import "X"
import "../x"
( モジュールディレクトリへの相対パス )import "../x/X"
(ディレクトリへのパス+モジュール名)助けて!
したがって、次のようなGo "ライブラリ"モジュールを作成しました。
この問題を解決するには、
replace
ディレクティブを使用します。
呼び出したモジュール名「X」を指定して、メインモジュールに次の行を追加します。
require "X" v0.0.0
replace "X" v0.0.0 => "{local path to the X module}"
パスはモジュールのルートディレクトリを指す必要があり、絶対パスまたは相対パスにすることができます。
モジュールutilをモジュール[〜#〜] x [〜#〜]からインポートするには:
import "X/util"
(モジュールはインポートしません。モジュールからパッケージをインポートします。)
Goのモジュール機能 は、公開されているモジュール用に設計されています。通常、モジュールの名前は、一意の識別子であり、パブリックリポジトリへのパスでもあります。 go.mod がrequire
ディレクティブでモジュールの依存関係を宣言すると、Goはそのパスでモジュールの指定されたバージョンを自動的に検索して取得します。
(GoモジュールFAQも参照してください ローカルファイルシステムでVCSの外部で完全に作業できますか? )
たとえば、go.mod
ファイルにrequire github.com/some/dependency v1.2.3
が含まれている場合、GoはそのパスのGitHubからモジュールを取得します。ただし、require X v0.0.0
が含まれている場合、「X」は実際のパスではないため、エラーcannot find module for path X
が発生します。
replace
ディレクティブを使用すると、特定のモジュール識別子とバージョンの代替パスを指定できます。 これを実行する多くの理由 があります。たとえば、モジュールへの変更をパブリックリポジトリにプッシュする前にテストするなどです。しかし、これを使用して、公開するつもりのないローカルコードにモジュール識別子をバインドすることもできます。
お役に立てれば。