ホームページ >バックエンド開発 >Golang >ワークスペースで使用すると go build が機能しない

ワークスペースで使用すると go build が機能しない

王林
王林転載
2024-02-08 21:06:181281ブラウズ

与工作区一起使用时 go build 不起作用

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

次のエラーが発生しました。

リーリー

usego 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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。