web-dev-qa-db-ja.com

ローカルGoモジュールをインポートして「パスXのモジュールが見つからない」ことを解決するにはどうすればよいですか?

私のGoプロジェクトでは、いくつかの一般的な機能をメインプロジェクトとは別のGoモジュールに分割したいと思います。私はこれをGOPATHの外で行って、goの将来に対応しています。モジュールをGitHubや他の場所に公開したくありません。

このモジュールをメインプロジェクトにインポートしようとすると、次のような結果になります。

cannot find module for path X

モジュールのフォルダーでgo mod init Xを実行しました。 go.modファイルの内容は次のとおりです。

module X

このモジュールのビルドまたはインストールは何もしないようです。 $GOPATH/pgk/modにその兆候は見つかりませんでした。

さまざまなインポートステートメントを試しました。

助けて!

11
Inigo

したがって、次のようなGo "ライブラリ"モジュールを作成しました。

  • gitHubや他の場所で公開したくない
  • インポートしてプロジェクト(「メイン」モジュール)で使用したい。

この問題を解決するには、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.modrequireディレクティブでモジュールの依存関係を宣言すると、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ディレクティブを使用すると、特定のモジュール識別子とバージョンの代替パスを指定できます。 これを実行する多くの理由 があります。たとえば、モジュールへの変更をパブリックリポジトリにプッシュする前にテストするなどです。しかし、これを使用して、公開するつもりのないローカルコードにモジュール識別子をバインドすることもできます。

お役に立てれば。

19
Hamza Anis