Ubuntu16.04で複数のプラットフォーム用のGo実行可能ファイルを構築する方法
序章
Goプログラミング言語には、パッケージの取得と実行可能ファイルの構築を非常に簡単にする豊富なツールチェーンが付属しています。 Goの最も強力な機能の1つは、Goがサポートする外部プラットフォーム用の実行可能ファイルをクロスビルドする機能です。 これにより、パッケージを配布するために特定のプラットフォームにアクセスする必要がないため、テストとパッケージ配布がはるかに簡単になります。
このチュートリアルでは、Goのツールを使用して、バージョン管理からパッケージを取得し、その実行可能ファイルを自動的にインストールします。 次に、実行可能ファイルを手動でビルドしてインストールし、プロセスに精通できるようにします。 次に、異なるアーキテクチャ用の実行可能ファイルをビルドし、ビルドプロセスを自動化して、複数のプラットフォーム用の実行可能ファイルを作成します。 完了すると、WindowsとmacOS、およびサポートしたい他のプラットフォーム用の実行可能ファイルを作成する方法がわかります。
前提条件
このチュートリアルに従うには、次のものが必要です。
- Ubuntu16.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
- Ubuntu16.04にGo1.6をインストールする方法の説明に従ってインストールします。
ステップ1—バージョン管理からGoプログラムをインストールする
Goパッケージから実行可能ファイルを作成する前に、そのソースコードを取得する必要があります。 The go get
ツールは、GitHubなどのバージョン管理システムからパッケージをフェッチできます。 フードの下、 go get
パッケージをのサブディレクトリにクローンします $GOPATH/src/
ディレクトリ。 次に、該当する場合は、実行可能ファイルをビルドしてパッケージをインストールします。 $GOPATH/bin
ディレクトリ。 前提条件のチュートリアルで説明されているようにGoを構成した場合、 $GOPATH/bin
ディレクトリはあなたに含まれています $PATH
環境変数。システムのどこからでもインストール済みパッケージを使用できるようにします。
の構文 go get
コマンドは go get package-import-path
. The package-import-path
パッケージを一意に識別する文字列です。 多くの場合、Githubなどのリモートリポジトリ内のパッケージの場所、または内のディレクトリです。 $GOPATH/src/
マシン上のディレクトリ。
使用するのが一般的です go get
とともに -u
指示するフラグ go get
パッケージとその依存関係を取得するか、それらの依存関係がマシンにすでに存在する場合はそれらを更新します。
このチュートリアルでは、Goで記述されたWebサーバーであるCaddyをインストールします。 キャディーの指示xに従って、使用します github.com/mholt/caddy/caddy
パッケージのインポートパス。 使用する go get
キャディをフェッチしてインストールするには:
- go get -u github.com/mholt/caddy/caddy
コマンドの完了にはしばらく時間がかかりますが、パッケージをフェッチしてインストールしている間は進行状況は表示されません。 出力がない場合は、コマンドが正常に実行されたことを実際に示しています。
コマンドが完了すると、Caddyのソースコードが次の場所にあります。 $GOPATH/src/github.com/mholt/caddy
. さらに、Caddyには実行可能ファイルがあるため、自動的に作成され、 $GOPATH/bin
ディレクトリ。 を使用してこれを確認します which
実行可能ファイルの場所を出力するには:
- which caddy
次の出力が表示されます。
Output/home/sammy/work/bin/caddy
注: go get
コマンドは、Gitリポジトリのデフォルトブランチからパッケージをインストールします。多くの場合、これは master
、または開発中のブランチ。 通常はリポジトリのにある手順を確認してください README
ファイル、使用する前に go get
.
次のようなGitコマンドを使用できます git checkout
を使用して取得したソースで別のブランチを選択するには go get
指図。 チュートリアルGitブランチの使用方法を確認して、ブランチを切り替える方法の詳細を確認してください。
すでに取得したパッケージから実行可能ファイルを作成することから始めて、Goパッケージをインストールするプロセスをより詳細に見てみましょう。
ステップ2—実行可能ファイルを作成する
The go get
コマンドはソースをダウンロードし、Caddyの実行可能ファイルを1つのコマンドでインストールしました。 ただし、実行可能ファイルを自分で再構築するか、独自のコードから実行可能ファイルを構築することをお勧めします。 The go build
コマンドは実行可能ファイルをビルドします。
すでにCaddyをインストールしましたが、プロセスに慣れるために、手動で再度ビルドしてみましょう。 実行する go build
パッケージのインポートパスを指定します。
- go build github.com/mholt/caddy/caddy
以前と同様に、出力がない場合は正常に動作したことを示します。 実行可能ファイルは、パッケージを含むディレクトリと同じ名前で、現在のディレクトリに生成されます。 この場合、実行可能ファイルの名前は caddy
.
パッケージディレクトリにいる場合は、パッケージへのパスを省略して、単に実行することができます go build
.
実行可能ファイルに別の名前または場所を指定するには、 -o
国旗。 と呼ばれる実行可能ファイルを作成しましょう caddy-server
そしてそれを build
現在の作業ディレクトリ内のディレクトリ:
- go build -o build/caddy-server github.com/mholt/caddy/caddy
このコマンドは実行可能ファイルを作成し、また ./build
存在しない場合はディレクトリ。
次に、実行可能ファイルのインストールを見てみましょう。
ステップ3—実行可能ファイルのインストール
実行可能ファイルを作成すると、現在のディレクトリまたは選択したディレクトリに実行可能ファイルが作成されます。 実行可能ファイルのインストールは、実行可能ファイルを作成してに保存するプロセスです。 $GOPATH/bin
. The go install
コマンドは次のように機能します go build
、 しかし go install
出力ファイルを適切な場所に配置します。
実行可能ファイルをインストールするには、 go install
、その後にパッケージのインポートパスが続きます。 もう一度、Caddyを使用してこれを試してください。
- go install github.com/mholt/caddy/caddy
と同じように go build
、コマンドが成功した場合、出力は表示されません。 以前と同様に、実行可能ファイルはパッケージを含むディレクトリと同じ名前で作成されます。 ただし、今回は実行可能ファイルがに格納されます $GOPATH/bin
. もしも $GOPATH/bin
あなたの一部です $PATH
環境変数の場合、実行可能ファイルはオペレーティングシステムのどこからでも利用できます。 あなたはを使用してその場所を確認することができます which
指図:
- which caddy
次の出力が表示されます。
Output of which/home/sammy/work/bin/caddy
方法を理解したので go get
, go build
、 と go install
動作し、それらがどのように関連しているかについて、最も人気のあるGo機能の1つである他のターゲットプラットフォーム用の実行可能ファイルの作成について見ていきましょう。
ステップ4—さまざまなアーキテクチャの実行可能ファイルを構築する
The go build
コマンドを使用すると、Goがサポートするターゲットプラットフォームの実行可能ファイルをプラットフォームに作成できます。 つまり、使用するターゲットプラットフォームで実行可能ファイルをビルドしなくても、アプリケーションをテスト、リリース、および配布できます。
クロスコンパイルは、ターゲットオペレーティングシステムとアーキテクチャを指定する必要な環境変数を設定することで機能します。 変数を使用します GOOS
ターゲットオペレーティングシステムの場合、および GOARCH
ターゲットアーキテクチャ用。 実行可能ファイルを作成するには、コマンドは次の形式になります。
- env GOOS=target-OS GOARCH=target-architecture go build package-import-path
The env
コマンドは、変更された環境でプログラムを実行します。 これにより、現在のコマンド実行にのみ環境変数を使用できます。 コマンドの実行後、変数は設定解除またはリセットされます。
次の表は、可能な組み合わせを示しています。 GOOS
と GOARCH
使用できます:
GOOS -ターゲットオペレーティングシステム |
GOARCH -ターゲットプラットフォーム |
---|---|
android |
arm |
darwin |
386 |
darwin |
amd64 |
darwin |
arm |
darwin |
arm64 |
dragonfly |
amd64 |
freebsd |
386 |
freebsd |
amd64 |
freebsd |
arm |
linux |
386 |
linux |
amd64 |
linux |
arm |
linux |
arm64 |
linux |
ppc64 |
linux |
ppc64le |
linux |
mips |
linux |
mipsle |
linux |
mips64 |
linux |
mips64le |
netbsd |
386 |
netbsd |
amd64 |
netbsd |
arm |
openbsd |
386 |
openbsd |
amd64 |
openbsd |
arm |
plan9 |
386 |
plan9 |
amd64 |
solaris |
amd64 |
windows |
386 |
windows |
amd64 |
警告: Android用の実行可能ファイルのクロスコンパイルには、 Android NDK と、このチュートリアルの範囲を超える追加のセットアップが必要です。
表の値を使用して、次のようにCaddy forWindows64ビットを構築できます。
- env GOOS=windows GOARCH=amd64 go build github.com/mholt/caddy/caddy
この場合も、操作が成功したことを示す出力はありません。 実行可能ファイルは、パッケージ名を名前として使用して、現在のディレクトリに作成されます。 ただし、この実行可能ファイルはWindows用に作成したため、名前は接尾辞で終わります .exe
.
あなたが持っている必要があります caddy.exe
現在のディレクトリにあるファイル。 ls
指図。
- ls caddy.exe
が表示されます caddy.exe
出力にリストされているファイル:
Outputcaddy.exe
注:使用できます -o
実行可能ファイルの名前を変更するか、別の場所に配置するためのフラグ。 ただし、Windows用の実行可能ファイルを作成して別の名前を指定する場合は、必ず明示的に指定してください。 .exe
実行可能ファイルの名前を設定するときの接尾辞。
複数のターゲット環境向けのソフトウェアをリリースしやすくするために、このプロセスのスクリプトを見てみましょう。
ステップ5—クロスコンパイルを自動化するスクリプトを作成する
多くのプラットフォームで実行可能ファイルを作成するプロセスは少し面倒ですが、スクリプトを作成して作業を簡単にすることができます。
スクリプトは、パッケージのインポートパスを引数として取り、オペレーティングシステムとプラットフォームのペアの事前定義されたリストを反復処理し、各ペアの実行可能ファイルを生成して、出力を現在のディレクトリに配置します。 各実行可能ファイルには、パッケージ名の後にターゲットプラットフォームとアーキテクチャが続く形式で名前が付けられます。 package-OS-architecture
. これは、あらゆるプロジェクトで使用できるユニバーサルスクリプトになります。
ホームディレクトリに切り替えて、という新しいファイルを作成します go-executable-build.bash
テキストエディタで:
- cd ~
- nano go-executable-build.bash
スクリプトはshebang行から始めます。 この行は、実行可能ファイルとして実行されたときにこのスクリプトを解析するインタープリターを定義します。 次の行を追加して、 bash
このスクリプトを実行する必要があります:
#!/usr/bin/env bash
パッケージのインポートパスをコマンドライン引数として使用します。 これを行うには、 $n
変数、ここで n
は非負の数です。 変数 $0
実行したスクリプトの名前が含まれていますが、 $1
以上には、ユーザー指定の引数が含まれます。 この行をスクリプトに追加します。これにより、コマンドラインから最初の引数が取得され、次の変数に格納されます。 package
:
...
package=$1
次に、ユーザーがこの値を指定したことを確認します。 値が指定されていない場合は、スクリプトの使用方法を説明するメッセージを表示してスクリプトを終了します。
...
if [[ -z "$package" ]]; then
echo "usage: $0 <package-name>"
exit 1
fi
これ if
ステートメントは、の値をチェックします $package
変数。 設定されていない場合は、 echo
正しい使用法を印刷してから、を使用してスクリプトを終了します exit
. exit
引数として戻り値を取ります。 0
成功した実行の場合はゼロ以外の値、失敗した実行の場合はゼロ以外の値。 を使用しております 1
スクリプトが成功しなかったので、ここに。
注:このスクリプトを事前定義されたパッケージで機能させる場合は、 package
そのインポートパスを指す変数:
...
package="github.com/user/hello"
次に、パスからパッケージ名を抽出します。 パッケージのインポートパスは次のように区切られます /
パスの最後にあるパッケージ名の文字。 まず、パッケージのインポートパスを配列に分割します。 /
区切り文字として:
package_split=(${package//\// })
パッケージ名は、この新しいの最後の要素である必要があります $package_split
配列。 Bashでは、負の配列インデックスを使用して、最初からではなく最後から配列にアクセスできます。 この行を追加して、配列からパッケージ名を取得し、それをという変数に格納します。 package_name
:
...
package_name=${package_split[-1]}
次に、実行可能ファイルをビルドするプラットフォームとアーキテクチャを決定する必要があります。 このチュートリアルでは、Windows 64ビット、Windows 32ビット、および64ビットmacOS用の実行可能ファイルを作成します。 これらのターゲットを次の形式の配列に配置します OS/Platform
、したがって、各ペアをに分割できます GOOS
と GOARCH
パスからパッケージ名を抽出するために使用したのと同じ方法を使用する変数。 スクリプトにプラットフォームを追加します。
...
platforms=("windows/amd64" "windows/386" "darwin/amd64")
次に、プラットフォームの配列を繰り返し処理し、各プラットフォームエントリを次の値に分割します。 GOOS
と GOARCH
環境変数、およびそれらを使用して実行可能ファイルをビルドします。 私たちは次のようにそれを行うことができます for
ループ:
...
for platform in "${platforms[@]}"
do
...
done
The platform
変数には、からのエントリが含まれます platforms
各反復の配列。 分割する必要があります platform
2つの変数に- GOOS
と GOARCH
. 次の行をに追加します for
ループ:
for platform in "${platforms[@]}"
do
platform_split=(${platform//\// })
GOOS=${platform_split[0]}
GOARCH=${platform_split[1]}
done
次に、パッケージ名とOSおよびアーキテクチャを組み合わせて、実行可能ファイルの名前を生成します。 Windows用に構築する場合は、 .exe
ファイル名の接尾辞。 このコードをに追加します for
ループ:
for platform in "${platforms[@]}"
do
platform_split=(${platform//\// })
GOOS=${platform_split[0]}
GOARCH=${platform_split[1]}
output_name=$package_name'-'$GOOS'-'$GOARCH
if [ $GOOS = "windows" ]; then
output_name+='.exe'
fi
done
変数を設定して、 go build
実行可能ファイルを作成します。 この行を本文に追加します for
ループ、真上 done
キーワード:
...
if [ $GOOS = "windows" ]; then
output_name+='.exe'
fi
env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name $package
done
最後に、実行可能ファイルの構築中にエラーが発生したかどうかを確認する必要があります。 たとえば、ソースがないパッケージをビルドしようとすると、エラーが発生する可能性があります。 確認できます go build
ゼロ以外の値に対するコマンドの戻りコード。 変数 $?
前のコマンドの実行からの戻りコードが含まれています。 もしも go build
以外のものを返します 0
、問題が発生したため、スクリプトを終了します。 このコードをに追加します for
ループ、後 go build
コマンド以上 done
キーワード。
...
env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name $package
if [ $? -ne 0 ]; then
echo 'An error has occurred! Aborting the script execution...'
exit 1
fi
これで、Goパッケージから複数の実行可能ファイルをビルドするスクリプトができました。 完成したスクリプトは次のとおりです。
#!/usr/bin/env bash
package=$1
if [[ -z "$package" ]]; then
echo "usage: $0 <package-name>"
exit 1
fi
package_split=(${package//\// })
package_name=${package_split[-1]}
platforms=("windows/amd64" "windows/386" "darwin/amd64")
for platform in "${platforms[@]}"
do
platform_split=(${platform//\// })
GOOS=${platform_split[0]}
GOARCH=${platform_split[1]}
output_name=$package_name'-'$GOOS'-'$GOARCH
if [ $GOOS = "windows" ]; then
output_name+='.exe'
fi
env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name $package
if [ $? -ne 0 ]; then
echo 'An error has occurred! Aborting the script execution...'
exit 1
fi
done
ファイルが前のコードと一致することを確認します。 次に、ファイルを保存してエディターを終了します。
スクリプトを使用する前に、スクリプトを実行可能にする必要があります。 chmod
指図:
- chmod +x go-executable-build.bash
最後に、Caddyの実行可能ファイルを作成して、スクリプトをテストします。
- ./go-executable-build.bash github.com/mholt/caddy/caddy
すべてがうまくいけば、現在のディレクトリに実行可能ファイルがあるはずです。 スクリプトが正常に実行されたことを示す出力はありません。 を使用して作成された実行可能ファイルであることを確認できます ls
指図:
- ls caddy*
3つのバージョンすべてが表示されます。
Example ls outputcaddy-darwin-amd64 caddy-windows-386.exe caddy-windows-amd64.exe
ターゲットプラットフォームを変更するには、 platforms
スクリプト内の変数。
結論
このチュートリアルでは、Goのツールを使用してバージョン管理システムからパッケージを取得する方法と、さまざまなプラットフォーム用の実行可能ファイルをビルドおよびクロスコンパイルする方法を学習しました。
また、多くのプラットフォーム用に単一のパッケージをクロスコンパイルするために使用できるスクリプトを作成しました。
アプリケーションが正しく動作することを確認するために、テストおよびTravis-CIやAppVeyorなどの継続的インテグレーションを確認してテストできます。 Windowsの場合。
Caddyとその使用方法に興味がある場合は、 Ubuntu16.04でCaddyを使用してWebサイトをホストする方法を参照してください。