前書き
これまでのHow To Code in Go seriesでは、コマンドgo run
を使用して、ソースコードを自動的にコンパイルし、結果の実行可能ファイルを実行しました。 このコマンドはコマンドラインでコードをテストするのに役立ちますが、アプリケーションを配布またはデプロイするには、コードを共有可能なbinary executable、またはアプリケーションを実行できるマシンバイトコードを含む単一のファイルにビルドする必要があります。 これを行うには、Goツールチェーンを使用してプログラムをbuildおよびinstallします。
Goでは、ソースコードをバイナリ実行可能ファイルに変換するプロセスはbuildingと呼ばれます。 この実行可能ファイルがビルドされると、アプリケーションだけでなく、ターゲットプラットフォームでバイナリを実行するために必要なすべてのサポートコードも含まれます。 これは、Ruby、Python、またはNode.jsなどの他の言語とは異なり、Goバイナリは新しいシステムで実行するためにGoツールなどのシステム依存関係を必要としないことを意味します。 これらの実行可能ファイルを独自のシステムの実行可能ファイルパスに配置すると、システムのどこからでもプログラムを実行できます。 これは、システムへのプログラムのinstallingと呼ばれます。
このチュートリアルでは、Goツールチェーンを使用してサンプルのHello, World!
プログラムを実行、ビルド、およびインストールし、将来のアプリケーションを効果的に使用、配布、およびデプロイできるようにします。
前提条件
この記事の例を実行するには、次のものが必要です。
-
How To Install Go and Set Up a Local Programming Environmentに従ってセットアップされたGoワークスペース。
Goバイナリのセットアップと実行
まず、Goツールチェーンのデモ用のサンプルとして使用するアプリケーションを作成します。 これを行うには、クラシックな「Hello、World!」を使用します。 How To Write Your First Program in Goチュートリアルのプログラム。
src
ディレクトリにgreeter
というディレクトリを作成します。
mkdir greeter
次に、新しく作成したディレクトリに移動し、選択したテキストエディタでmain.go
ファイルを作成します。
cd greeter
nano main.go
ファイルが開いたら、次の内容を追加します。
src/greeter/main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
実行すると、このプログラムはフレーズHello, World!
をコンソールに出力し、プログラムは正常に終了します。
ファイルを保存して終了します。
プログラムをテストするには、前のチュートリアルで行ったように、go run
コマンドを使用します。
go run main.go
次の出力が表示されます。
OutputHello, World!
前述のように、go run
コマンドは、ソースファイルを実行可能バイナリにビルドしてから、コンパイルされたプログラムを実行しました。 ただし、このチュートリアルの目的は、バイナリを自由に共有および配布できる方法でビルドすることです。 これを行うには、次のステップでgo build
コマンドを使用します。
go build
を使用したGoバイナリの構築
go build
を使用すると、サンプルのGoアプリケーション用の実行可能バイナリを生成できます。これにより、プログラムを必要な場所に配布およびデプロイできます。
main.go
でこれを試してください。 greeter
ディレクトリで、次のコマンドを実行します。
go build
このコマンドに引数を指定しない場合、go build
は現在のディレクトリにあるmain.go
プログラムを自動的にコンパイルします。 このコマンドには、ディレクトリ内のすべての*.go
ファイルが含まれます。 また、システムに.go
ソースファイルがあるかどうか、またはGoがインストールされているかどうかに関係なく、同じシステムアーキテクチャを持つ任意のコンピューターでバイナリを実行できるようにするために必要なすべてのサポートコードをビルドします。
この場合、greeter
アプリケーションを、現在のディレクトリに追加された実行可能ファイルに組み込みました。 ls
コマンドを実行してこれを確認します。
ls
macOSまたはLinuxを実行している場合、プログラムをビルドしたディレクトリにちなんで名前が付けられた新しい実行可能ファイルが見つかります。
Outputgreeter main.go
[.note]#Note: Windowsでは、実行可能ファイルはgreeter.exe
。
#になります。
デフォルトでは、go build
は現在のplatform and architectureの実行可能ファイルを生成します。 たとえば、linux/386
システム上に構築されている場合、実行可能ファイルは、Goがインストールされていなくても、他のlinux/386
システムと互換性があります。 Goは、他のプラットフォームやアーキテクチャの構築をサポートしています。これについては、Building Go Applications for Different Operating Systems and Architecturesの記事で詳しく読むことができます。
実行可能ファイルを作成したので、実行してバイナリが正しくビルドされたことを確認します。 macOSまたはLinuxで、次のコマンドを実行します。
./greeter
Windowsでは、次を実行します。
greeter.exe
バイナリの出力は、go run
でプログラムを実行したときの出力と一致します。
OutputHello, World!
これで、プログラムだけでなく、そのバイナリの実行に必要なすべてのシステムコードを含む単一の実行可能バイナリが作成されました。 これで、このプログラムを新しいシステムに配布したり、サーバーに展開したりできるようになり、ファイルが常に同じプログラムを実行することがわかります。
次のセクションでは、このチュートリアルでは、プログラムのビルドプロセスをより適切に制御できるように、バイナリの命名方法と変更方法について説明します。
バイナリ名の変更
実行可能ファイルを生成する方法がわかったので、次のステップは、Goがバイナリの名前を選択する方法を特定し、この名前をプロジェクトに合わせてカスタマイズすることです。
go build
を実行すると、デフォルトでは、Goが生成された実行可能ファイルの名前を自動的に決定します。 これは、次の2つの方法のいずれかで行われます。Go Modulesを使用している場合、Goはモジュール名の最後の部分を使用します。それ以外の場合、Goは現在のディレクトリの名前を使用します。 これは、前のセクションでgreeter
ディレクトリを作成し、それに変更してからgo build
を実行したときに使用した方法です。
モジュール方式を詳しく見てみましょう。 次のようなmodule
宣言を含むgo.mod
ファイルがプロジェクトにある場合:
go.mod
module github.com/sammy/shark
その場合、生成された実行可能ファイルのデフォルト名はshark
になります。
特定の命名規則を必要とするより複雑なプログラムでは、これらのデフォルト値が常にバイナリの命名に最適な選択とは限りません。 このような場合は、-o
フラグを使用して出力をカスタマイズするのが最適です。
これをテストするには、前のセクションで作成した実行可能ファイルの名前をhello
に変更し、bin
というサブフォルダーに配置します。 このフォルダーを作成する必要はありません。 Goはビルドプロセス中にそれを独自に行います。
-o
フラグを指定して次のgo build
コマンドを実行します。
go build -o bin/hello
-o
フラグにより、Goはコマンドの出力を選択した引数に一致させます。 この場合、結果はbin
という名前のサブフォルダーにhello
という名前の新しい実行可能ファイルになります。
新しい実行可能ファイルをテストするには、新しいディレクトリに移動してバイナリを実行します。
cd bin
./hello
次の出力が表示されます。
OutputHello, World!
プロジェクトのニーズに合わせて実行可能ファイルの名前をカスタマイズできるようになりました。Goでバイナリをビルドする方法に関する調査を完了しました。 ただし、go build
を使用すると、現在のディレクトリからのバイナリの実行に制限されます。 システムのどこからでも新しく構築された実行可能ファイルを使用するために、go install
を使用してインストールできます。
go install
を使用したGoプログラムのインストール
この記事のこれまでのところ、.go
ソースファイルから実行可能バイナリを生成する方法について説明してきました。 これらの実行可能ファイルは、配布、展開、およびテストには役立ちますが、ソースディレクトリの外部からはまだ実行できません。 これは、自分のシステムでワークフローを支援するコマンドラインツールを開発した場合など、プログラムを積極的に使用する場合に問題になります。 プログラムを使いやすくするために、システムにインストールしてどこからでもアクセスできます。
これが何を意味するのかを理解するには、go install
コマンドを使用してサンプルアプリケーションをインストールします。
go install
コマンドはgo build
とほぼ同じように動作しますが、実行可能ファイルを現在のディレクトリまたは-o
フラグで指定されたディレクトリに残す代わりに、実行可能ファイルを$GOPATH/bin
に配置します。 )sディレクトリ。
$GOPATH
ディレクトリの場所を見つけるには、次のコマンドを実行します。
go env GOPATH
受け取る出力はさまざまですが、デフォルトは$HOME
ディレクトリ内のgo
ディレクトリです。
Output$HOME/go
go install
は、生成された実行可能ファイルをbin
という名前の$GOPATH
のサブディレクトリに配置するため、このディレクトリを$PATH
環境変数に追加する必要があります。 これは、前提条件の記事How To Install Go and Set Up a Local Programming EnvironmentのCreating Your Go Workspaceステップで説明されています。
$GOPATH/bin
ディレクトリを設定したら、greeter
ディレクトリに戻ります。
cd ..
次に、インストールコマンドを実行します。
go install
これにより、バイナリがビルドされ、$GOPATH/bin
に配置されます。 これをテストするには、次を実行します。
ls $GOPATH/bin
これにより、$GOPATH/bin
の内容が一覧表示されます。
Outputgreeter
[.note]#Note:go install
コマンドはnotが-o
フラグをサポートするため、実行可能ファイルに名前を付けるために前述のデフォルト名の1つを使用します。
#
バイナリをインストールした状態で、プログラムがソースディレクトリの外部から実行されるかどうかをテストします。 ホームディレクトリに戻ります。
cd $HOME
次を使用してプログラムを実行します。
greeter
これにより、次の結果が得られます。
OutputHello, World!
作成したプログラムをシステムにインストールして、必要なときにいつでもどこからでも使用できるようになりました。
結論
このチュートリアルでは、Goツールチェーンを使用して、ソースコードから実行可能バイナリを簡単に構築する方法を示しました。 これらのバイナリは、Goツールや環境がないシステムでも、他のシステムで実行するために配布できます。 また、go install
を使用して、システムの$PATH
に実行可能ファイルとしてプログラムを自動的にビルドおよびインストールしました。 go build
とgo install
を使用すると、アプリケーションを自由に共有して使用できるようになります。
go build
の基本を理解したので、Customizing Go Binaries with Build Tagsチュートリアルを使用してモジュラーソースコードを作成する方法、またはBuilding Go Applications for Different Operating Systems and Architecturesを使用してさまざまなプラットフォーム用にビルドする方法を調べることができます。 Goプログラミング言語全般について詳しく知りたい場合は、How To Code in Go series全体を確認してください。