新しいGoプログラマーは、基本的なgo buildコマンドが何をするのかを知らないか、混乱しないことがよくあります。
go build
およびgo install
コマンドは正確に何を構築し、結果/出力をどこに配置しますか?
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 build
( source )によって作成された実行可能ファイルも削除されることにも注意してください。
'go install'(引数なし、現在のディレクトリを意味する)が成功した場合、 'go build'によって書き込まれた実行可能ファイルが存在する場合は削除します。これにより、古いバイナリが残るのを防ぎます...
リストを完成させるために、go run
はアプリケーションを一時フォルダーにコンパイルし、その実行可能バイナリーを開始します。アプリが終了すると、一時ファイルが適切にクリーンアップされます。
デイブ・チェイニーのインスピレーションを受けた質問 ビルドビルドは何ですか?
パッケージの場合:
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
が使用するパッケージも再インストールされなくなりますコンパイラー最適化のないライブラリー。