php editor Banana は、ワークスペースの使用時に go build コマンドが正しく動作しないというよくある問題を紹介します。ワークスペースは Go 言語において非常に重要な概念であり、go build コマンドを適切に使用できないと開発プロセスに重大な影響を与えるため、この問題は開発者を混乱させる可能性があります。次の記事では、この問題の原因を詳しく分析し、開発者がこの問題を正常に解決できるようにするための解決策を提供します。
以下は私の golang コードの構造です。
リーリー問題は、単一モジュールのバイナリしかビルドできないことです。他のモジュールをビルドする場合、go.work
で他のモジュールをコメントアウトした場合にのみ機能します。私の go.work は次のとおりです。
リーリーしたがって、上記の go.work を使用して次のようにビルドすると、正常に動作します。
go build -o test-binary -modfile ./moda/go.mod ./moda
しかし、以下に示すように、他のモジュール (つまり modb/) 用にビルドしようとすると、
go build -o test-binary1 -modfile ./go.mod ./modb
次のエラーが発生しました。
リーリーuse で
go to work を使用してみましたが、まだ同じ問題に直面しています。誰かこの問題の解決を手伝ってくれませんか?
編集 1:
メイン モジュールとサブモジュールの依存関係を分離するために複数の go.mod ファイルが必要なプロジェクトがありました。そのとき、私のユースケースに適した go ワークスペースについて学び始めました。
私のプロジェクト構造は上記と同じです。
リーリー ここで、サブモジュールの実行可能ファイルをビルドする場合、 go build は正常に機能しますが、メイン モジュールの実行可能ファイルをビルドする場合、submodule/go.mod に存在するインポートもメイン モジュールの実行可能ファイルの中央に追加されます。 go build -n
でもこれを確認しました。
サブモジュールのインポートをメイン モジュールの実行可能ファイルに追加するのを避けるために、-modfile
を使用しましたが、これを使用するとサブモジュールの実行可能ファイルのみをビルドでき、メイン モジュールのドキュメントの実行可能ファイルはビルドできません。
github ソースコード
ps: github にサンプル コードを追加しましたが、同じ問題を再現できません (サブモジュールのインポートがメイン モジュールに追加されます)。使用しているインポートが原因かどうかはわかりません。
@arigatomangaと話し合った結果、ワークスペースの最小バージョン選択(mvs)が混乱の原因であることがわかりました。ワークスペースは、最小バージョン選択 (mvs) (Reference) の実行時にメイン モジュールとして使用される、ディスク上のモジュールのコレクションです。 mvs のおかげで、ワークスペース モードを有効にしてビルドしたモジュールは、ワークスペース モードを無効にしてビルドしたモジュールとは異なる依存モジュールを使用できます。
これはワークスペースの記録された動作であり、現時点では問題ありません。
更新: 以下は、-modfile
フラグに焦点を当てた元の回答です。 go1.21 のワークスペース モードでは、このフラグは拒否されます。
Go ツールでエラーが発生しました。この問題を ここ で報告しました。
go1.20 のエラー メッセージは異なり、依然として誤解を招きます:
リーリー この違いは、コミット cmd/go/internal/modload: go.work のモジュール間でモジュール パスが重複するとエラーが返されることで生じましたが、根本的な原因は同じです。ワークスペース モードでは -modfile
フラグが正しく処理されませんでした。
更新: 次のセクションは現時点では関係ありません。 mvc とは何かを理解する前に、-modfile
フラグを使用して mvs を抑制しようとすると失敗します。
問題レポートでは、ワークスペース モードで -modfile
フラグをブロックすることを提案しました。しかし、コメントでこのフラグが必要だと言いました。
-modfile
を使用する理由は、./src
のバイナリをビルドすると、./moda
に存在するモジュールも含められるためです。 ./src
ダウンロードおよびロードされたバイナリ ファイルの一部 (含めるべきではありません)
ただし、cmd/go ドキュメントによると :
-modfile ファイル
モジュール認識モードでは、代わりの go.mod を読み取ります (場合によっては書き込みます)。 モジュールのルート ディレクトリ内のファイルの代わりにファイルを使用します。という名前の人 モジュールのルートを決定するには「go.mod」がまだ存在している必要があります ディレクトリにありましたが、そのディレクトリにはアクセスされませんでした。 -modfileを指定すると、 代替の go.sum ファイルも使用します。そのパスは次から導出されます。 -modfile フラグ。拡張子「.mod」を削除し、「.sum」を追加します。
-modfile
フラグは、モジュール ルート ディレクトリ内の go.mod
ファイルを置き換えます。しかし、あなたの例では、モジュールルートにあるファイルと同じファイルを指定しました。だから、よくわかりません。この部分について詳しく説明するために質問を更新してもらえますか?デモは占領されています!
以上がワークスペースで使用すると go build が機能しないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。