1. ホーム
  2. go

[解決済み] go buildは何を作るのか?(go build vs. go install)

2022-05-15 13:22:01

質問

新しい Go プログラマは、基本的な go build コマンドが何をするのか知らないか、または混乱していることがよくあります。

はいったい何をするのでしょうか? go buildgo install コマンドはビルドし、その結果や出力をどこに置くのでしょうか?

どのように解決するのですか?

どのような go コマンドが何をするかは、このコマンドを通常のパッケージに対して実行するか、あるいは特別な "main" パッケージのために実行するかによって異なります。

パッケージの場合

  • go build   がパッケージをビルドします。 その結果を破棄します。 .
  • go install をビルドします。 をインストールします。 をインストールします。 $GOPATH/pkg ディレクトリにインストールします。

コマンドの場合(パッケージ main )

  • go build   はコマンドをビルドし、その結果を カレントワーキングディレクトリ .
  • go install は、一時ディレクトリにコマンドをビルドし、それを $GOPATH/bin .

に渡すもの go build ?

あなたは パッケージ go build に、ビルドしたいパッケージのリストを渡す。のリストを渡すこともできます。 .go ファイルを渡すこともでき、その場合は一つのパッケージを指定する ソースファイルのリストとして扱われます。

パッケージ(インポートパス)が提供されない場合、ビルドは現在のディレクトリに適用されます。

インポートパスは、1つまたは複数の "..." のワイルドカードを含むことができます(この場合、それは パターン ). ... は任意の文字列にマッチし、例えば net/... にマッチするのは net パッケージと、そのサブフォルダにあるパッケージにマッチします。コマンドは

go build ./...

現在のフォルダーとその下にあるすべてのパッケージをビルドするためによく使われます。プロジェクトルートで発行されたこのコマンドは、完全なプロジェクトをビルドします。

パッケージの指定の詳細については go help packages .

モジュールについて

Go モジュールの予備的なサポートは Go 1.11 で導入され、Go 1.13 からはモジュールがデフォルトになりました。このとき go ツールを含むフォルダから実行すると go.mod ファイル (または現在のフォルダの親の一つ) を含むフォルダから実行すると go ツールは モジュールを意識した モードで動作します (レガシーモードでは GOPATH モード ).

モジュール認識モードでは、GOPATH はもはやビルド中の import の意味を定義しません。 しかし、ダウンロードされた依存関係 (GOPATH/pkg/mod) とインストールされたコマンド (GOPATH/bin) はまだ保存されています。 とインストールされたコマンド (GOBIN が設定されていない限り、GOPATH/bin) を保存します。

モジュールをビルドするとき、何がビルドされるかは ビルドリスト . ビルドリストには、最初はメインモジュール( go コマンドが実行されるディレクトリを含むモジュール) のみが含まれ、メインモジュールの依存関係が再帰的にビルドリストに追加されます (依存関係の依存関係も追加されます)。

より詳細な情報は go help modules .


基本的には go build はパッケージが (依存関係とともに) ビルド可能であることをチェックするもので、一方 go install の適切なフォルダに (恒久的に) インストールされます。 $GOPATH .

go build は、問題がなければ静かに終了し、パッケージのビルドやコンパイルができない場合はエラーメッセージを出します。

が実行されるたびに go ツールがパッケージやバイナリをインストールするときは、 そのパッケージが持つ依存関係もインストールされます。 go install を実行すると、あなたのプログラムが依存しているパッケージ (一般に入手可能な、"go gettable" パッケージ) も自動的にインストールされます。

手始めに、公式の Goコードの書き方 のページで説明します。

の詳細については go ツールを使用します。 コマンドゴー

また、以下のコマンドを実行することで、より多くのヘルプを得ることができます。

go help build

また、Go 1.5 からは go install で作成された実行可能ファイルを削除するようになりました。 go build ( ソース ):

go install' (引数なし、カレントディレクトリを意味する) が成功したら、'go build' で書き込んだ実行ファイルを削除する。 が成功したら、'go build' によって書き込まれた実行ファイルがあれば、それを削除します。これは、古いバイナリを残すことを避けるためです...

リストを完成させるために go run は、アプリケーションを一時フォルダにコンパイルし、その実行バイナリを起動します。アプリが終了するとき、一時ファイルを適切にクリーンアップします。

Dave Cheney の go build buildとは何ですか?