🍣

go buildいつ使うの? (written with ChatGPT)

2023/04/27に公開

go build -gcflags "all=-N -l" -o ./bin/server ./cmd/api
これはなにをしてる?


このコマンドは、Go言語で書かれたプログラムをビルドして、実行可能なバイナリファイルを生成しています。各フラグの説明は以下の通りです。

  • go build: Goプログラムをビルドするコマンドです。
  • gcflags "all=-N -l": Goコンパイラにフラグを渡します。N は最適化を無効化し、l はインライン展開を無効化します。これらのフラグは、デバッグ時に役立ちます。ソースコードが変更されたときのみ、変数や関数が最適化されず、デバッガが正確な情報を表示できるようになります。
  • o ./bin/server: ビルドされたバイナリファイルの出力先を指定します。この例では、./bin/server にバイナリが生成されます。
  • ./cmd/api: ビルド対象のGoプログラムのパスを指定します。この例では、./cmd/api ディレクトリ内のプログラムがビルドされます。

このコマンドを実行すると、./cmd/apiディレクトリ内のGoプログラムがビルドされ、./bin/serverという名前の実行可能なバイナリファイルが生成されます。


プログラムをビルドするのはどのようなときですか?開発中も使いますか?


プログラムをビルドするのは、主に以下のような場合です。

  1. 開発中: 開発中にプログラムをビルドして実行し、動作を確認したりデバッグしたりします。開発者は、機能を追加したりバグを修正したりしながら何度もビルドを行うことが一般的です。
  2. テスト: 開発が一段落したら、テスト環境でプログラムをビルドして実行し、機能や性能のテストを行います。この段階で問題が見つかった場合、開発者は再度コードを修正し、再度ビルドとテストを行います。
  3. デプロイメント: テストが完了し、プログラムが本番環境で実行される準備が整ったら、プログラムをビルドして実行可能なバイナリファイルを生成します。このバイナリファイルを本番環境にデプロイし、実際のユーザーが利用できるようにします。

開発中もプログラムをビルドすることは一般的です。機能追加やバグ修正のたびに、コードが期待通りに動作するか確認するためにビルドと実行を繰り返します。ただし、Go言語のようなコンパイル言語の場合、ビルド時間がかかることもあるため、開発中は一部の最適化やインライン展開を無効にしてビルド時間を短縮することがあります。これが、前述の go build -gcflags "all=-N -l" コマンドで行われていることです。


開発中にソースコードを変更したら、一旦停止し、go run コマンドで改めて起動すればビルドは不要ではないのですか?


ご指摘の通り、開発中にソースコードを変更した場合、go run コマンドを使ってプログラムを起動すれば、ビルドは自動的に行われます。go run コマンドは、内部でソースコードのビルドと実行を行ってくれるため、開発者が手動でビルドを行う必要はありません。

しかし、go build を使って明示的にビルドを行うことも開発者によっては好まれます。以下にその理由をいくつか挙げます。

  1. ビルドのみを行いたい場合: go run はビルドと実行を一緒に行いますが、実行せずにビルドのみを行いたい場合があります。例えば、バイナリファイルを生成してデプロイメントの準備をしたり、ビルドエラーがないかチェックしたりする場合などです。
  2. 最適化やデバッグオプションを適用したい場合: go build を使うと、ビルド時にオプションを指定して最適化やデバッグを行うことができます。go run でも同様のオプションを指定できますが、go build を使ったほうがビルドオプションを明示的に指定できるため、管理がしやすくなります。
  3. 実行可能なバイナリファイルを生成したい場合: go build を使うと、実行可能なバイナリファイルを生成できます。このバイナリファイルは他の環境で実行することができるため、デプロイメントや配布に便利です。

開発中にどちらのコマンドを使うかは、開発者の好みや開発スタイルに依存します。go run が便利であることは間違いありませんが、上記のような理由で go build を使うことも一般的です。

Discussion