[解決済み] go buildは何を作るのか?(go build vs. go install)
質問
新しい Go プログラマは、基本的な go build コマンドが何をするのか知らないか、または混乱していることがよくあります。
はいったい何をするのでしょうか?
go build
と
go 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とは何ですか?
関連
-
[解決済み] Error:java: invalid source release: Intellijでは8です。これはどういう意味ですか?
-
[解決済み] golang の "go get" コマンドで "go: missing Git command" というエラーが表示される。
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] JIT(ジャストインタイム)コンパイラとは、どのようなものですか?
-
[解決済み] Visual Studioの「Any CPU」ターゲットはどういう意味ですか?
-
[解決済み] Xcodeの警告。"出力ファイルに対する複数のビルドコマンド"
-
[解決済み】Xcodeのコマンドラインからの "Build and Archive "について
-
[解決済み】警告。コピーバンドルリソースのビルドフェーズには、このターゲットのInfo.plistファイルが含まれています。
-
[解決済み】ビルドデータの表示について
-
[解決済み] npm build` は package.json 内の "build" という名前のスクリプトを実行しません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】golangでデータ構造をディープコピーする
-
go build error, error can't load package: package xxx is not in GOROOT (D:\basic_tool╱GoGoSrc╱)
-
runnerw.exe: CreateProcess はエラー 216 で失敗しました。プロセスが終了し、終了コード 216 が表示された 実行するプロジェクトがこの例外をスローする
-
[解決済み] GOBINが設定されていない:go installを実行できない
-
[解決済み] goインストールとは何ですか?
-
[解決済み] go getとgo installの違いは何ですか?
-
[解決済み】Goで設定を処理する方法【終了しました
-
[解決済み】Goでディレクトリを一覧表示する
-
[解決済み】GoはREPLを提供しますか?
-
[解決済み】アプリケーションの自動ビルドによるバージョン管理