Goプログラムをビルドしてインストールする方法

前書き

これまでのHow To Code in Go seriesでは、コマンドgo runを使用して、ソースコードを自動的にコンパイルし、結果の実行可能ファイルを実行しました。 このコマンドはコマンドラインでコードをテストするのに役立ちますが、アプリケーションを配布またはデプロイするには、コードを共有可能なbinary executable、またはアプリケーションを実行できるマシンバイトコードを含む単一のファイルにビルドする必要があります。 これを行うには、Goツールチェーンを使用してプログラムをbuildおよびinstallします。

Goでは、ソースコードをバイナリ実行可能ファイルに変換するプロセスはbuildingと呼ばれます。 この実行可能ファイルがビルドされると、アプリケーションだけでなく、ターゲットプラットフォームでバイナリを実行するために必要なすべてのサポートコードも含まれます。 これは、RubyPython、またはNode.jsなどの他の言語とは異なり、Goバイナリは新しいシステムで実行するためにGoツールなどのシステム依存関係を必要としないことを意味します。 これらの実行可能ファイルを独自のシステムの実行可能ファイルパスに配置すると、システムのどこからでもプログラムを実行できます。 これは、システムへのプログラムのinstallingと呼ばれます。

このチュートリアルでは、Goツールチェーンを使用してサンプルのHello, World!プログラムを実行、ビルド、およびインストールし、将来のアプリケーションを効果的に使用、配布、およびデプロイできるようにします。

前提条件

この記事の例を実行するには、次のものが必要です。

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 EnvironmentCreating 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 buildgo 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全体を確認してください。