ビルドビルドとは何ですか?(ビルドとインストールの比較)


回答:


125

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はビルド中のインポートの意味を定義しなくなりましたが、ダウンロードされた依存関係(GOPATH / pkg / mod内)とインストールされたコマンド(GOBINが設定されていない場合はGOPATH / bin内)を保存します。

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

詳細については、を実行してくださいgo help modules


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

go build すべて問題なければサイレントで終了し、パッケージをビルドまたはコンパイルできない場合はエラーメッセージが表示されます。

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

まず、公式のGoコードの書き方のページをお読みください。

goツールの詳細情報:コマンドgo

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

go help build

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

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

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

質問は、デイブチェイニー副大統領に触発行くビルドビルドを何?


1
以前にインストールされたものと同一の場合、go installが実行可能ファイルを更新しないのは奇妙に思えます...ここでの洞察はありますか?
Scott Stensland

14

パッケージの場合:

go build:パッケージをビルドして、結果を破棄します

ゴー1.10(Q1 2018)は、に感謝した後、それは事実ではありません CL 68116およびCL 75473。私がここで参照しているこのスレッドを参照してください。

go buildand go installコマンドは正確に何を構築しますか

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

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

" go install"コマンドは、指定されたパッケージの依存関係をインストールしなくなりましたCL 75850)。

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」はとそれ自体のすべての依存関係の完全な再構築を強制myprogmyprogますが、myprogインストールされるだけです。(もちろん、再構築されたすべての依存関係は依然としてビルドキャッシュに保存されます。)
このケースをより理解しやすくすることは、以前よりも頻繁に依存関係を再構築する正当な理由があるため、新しいコンテンツベースの古さ分析と併せて特に重要です。これは、「なぜ依存関係がインストールされたのか」という混乱の量を増加させることになります。
たとえば、「go install -gcflags=-N myprog」を実行すると、myprogコンパイラ最適化なしでビルドされますmyprogが、コンパイラ最適化なしで標準ライブラリから使用するパッケージを再インストールすることもありません。


DOES go build、やるgetのか?ビルドエラーがありますcannot find package "github.com/spf13/cobra" in any of:…。私はそれを取得するためにそれを言う方法を知りません。明示的に取得する必要がありますか?
ctrl-alt-delor

@ ctrl-alt-delor Goのどのバージョンを使用していますか?プロジェクトにはgo.modファイルが含まれていますか?
VonC、

go version go1.11.4 linux/amd64。go.modについて知りません。私は再https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go構築していますが、パッケージ全体をビルドしたばかりで、この例をベースとして使用しているので奇妙です。動作する(ただし、このライブラリを使用しない)より基本的なバージョンを作成しました。moustacheパッケージでどのようにインストールされなかったのかわかりません。
ctrl-alt-delor

@ ctrl-alt-delor so cobrはベンダーgithub.com/cbroglie/mustache/tree/master/cmd/mustache/vendor/…です。GOPATHは正しく設定されていますか?
VonC、

私はあなたがすでに見つけたものを発見しました。パッケージはベンダーのサブディレクトリにあります。これがインストールされなかった理由です。ただし、ビルド時にインストールされない理由はわかりません。または、ベンダーディレクトリの使用方法(自分のディレクトリにコピーした場合)。
ctrl-alt-delor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.