web-dev-qa-db-ja.com

go build buildとは何ですか?

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

go buildおよびgo installコマンドは正確に何を構築し、結果/出力をどこに配置しますか?

75
icza

goコマンドの動作は、「通常の」パッケージに対して実行するか、特別な"main"パッケージに対して実行するかによって異なります。

パッケージの場合

  • go build  はパッケージをビルドし、は結果を破棄します
  • go installは、$GOPATH/pkgディレクトリにパッケージをインストールしてからinstallsします。

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

  • go build  はコマンドをビルドし、結果を現在の作業ディレクトリに残します
  • go installは一時ディレクトリにコマンドを作成し、$GOPATH/binに移動します。

基本的に、go buildを(依存関係とともに)パッケージをビルドできるかどうかのチェックとして使用できますが、go installも(永続的に)結果を$GOPATHの適切なフォルダーにインストールします。

go buildは、すべてが正常である場合はサイレント終了し、パッケージをビルド/コンパイルできない場合はエラーメッセージを表示します。

goツールがパッケージまたはバイナリをインストールするときは常に、依存関係もインストールするため、go installを実行すると、プログラムが依存するパッケージ(公開されている「go gettable」パッケージ)も自動的にインストールされます。

はじめに、公式の Goコードの書き方 ページを読んでください。

goツールの詳細: Command go

次のコマンドを実行して、さらにヘルプを表示することもできます。

go help build

Go 1.5 go installから開始すると、go buildsource )によって作成された実行可能ファイルも削除されることにも注意してください。

'go install'(引数なし、現在のディレクトリを意味する)が成功した場合、 'go build'によって書き込まれた実行可能ファイルが存在する場合は削除します。これにより、古いバイナリが残るのを防ぎます...

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

デイブ・チェイニーのインスピレーションを受けた質問 ビルドビルドは何ですか?

92
icza

パッケージの場合:

go build:パッケージをビルドしてからdiscards結果

Go 1.10(2018年第1四半期)以降はそうではありません。 CL 68116 および CL 7547 に感謝します。ここで参照する このスレッド を参照してください。

go buildおよびgo installコマンドが正確にビルドすること

Goツールがパッケージまたはバイナリをインストールするたびに、依存関係もインストールするため、go installを実行すると、プログラムが依存するパッケージ(公開されている「go gettable」パッケージ)も自動的にインストールされます。

実際... go installはGo 1.10でも変更されます追加新しいキャッシュ:

go install」コマンドは、名前付きパッケージの依存関係をインストールしなくなりましたCL 7585 )。

go install foo」を実行した場合、インストールされるのはfooのみです。

以前は変化しました。依存関係が古い場合、「go install」も依存関係をインストールしました。
go install」中の依存関係の暗黙的なインストールは、ユーザーに多くの混乱と頭痛の種を引き起こしましたが、以前はインクリメンタルビルドを有効にする必要がありました。
もう違います。
新しい「install what I said」セマンティクスは、特に多くのユーザーがすでに期待しているバグ報告から明らかであるため、はるかに理解しやすいと考えています。
go install」中に依存関係のインストールを強制するには、類推により、新しい「go install -iを使用します「go build -i」と「go test -i」で。

go install」が再構築された依存関係をインストールするために使用されたという事実は、「-a」を意味するforce rebuild of all dependenciesと組み合わせて最も頻繁に混乱を引き起こしました。
今、「go install -a myprog」はmyprogのすべての依存関係とmyprog自体の完全な再構築を強制しますが、myprogのみがインストールされます。 (再構築されたすべての依存関係は、もちろんビルドキャッシュに保存されます。)
このケースをより理解しやすくすることは、新しいコンテンツベースの古さの分析と併せて特に重要です。なぜなら、以前よりも頻繁に依存関係を再構築する正当な理由があるためです。 「インストールする」という混乱。
たとえば、「go install -gcflags=-N myprog」を実行すると、コンパイラの最適化なしでビルドされたmyprogがインストールされますが、標準からmyprogが使用するパッケージも再インストールされなくなりますコンパイラー最適化のないライブラリー。

13
VonC