序章

Goプログラミング言語には、パッケージの取得と実行可能ファイルの構築を非常に簡単にする豊富なツールチェーンが付属しています。 Goの最も強力な機能の1つは、Goがサポートする外部プラットフォーム用の実行可能ファイルをクロスビルドする機能です。 これにより、パッケージを配布するために特定のプラットフォームにアクセスする必要がないため、テストとパッケージ配布がはるかに簡単になります。

このチュートリアルでは、Goのツールを使用して、バージョン管理からパッケージを取得し、その実行可能ファイルを自動的にインストールします。 次に、実行可能ファイルを手動でビルドしてインストールし、プロセスに精通できるようにします。 次に、異なるアーキテクチャ用の実行可能ファイルをビルドし、ビルドプロセスを自動化して、複数のプラットフォーム用の実行可能ファイルを作成します。 完了すると、WindowsとmacOS、およびサポートしたい他のプラットフォーム用の実行可能ファイルを作成する方法がわかります。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ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 キャディをフェッチしてインストールするには:

  1. go get -u github.com/mholt/caddy/caddy

コマンドの完了にはしばらく時間がかかりますが、パッケージをフェッチしてインストールしている間は進行状況は表示されません。 出力がない場合は、コマンドが正常に実行されたことを実際に示しています。

コマンドが完了すると、Caddyのソースコードが次の場所にあります。 $GOPATH/src/github.com/mholt/caddy. さらに、Caddyには実行可能ファイルがあるため、自動的に作成され、 $GOPATH/bin ディレクトリ。 を使用してこれを確認します which 実行可能ファイルの場所を出力するには:

  1. 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 パッケージのインポートパスを指定します。

  1. go build github.com/mholt/caddy/caddy

以前と同様に、出力がない場合は正常に動作したことを示します。 実行可能ファイルは、パッケージを含むディレクトリと同じ名前で、現在のディレクトリに生成されます。 この場合、実行可能ファイルの名前は caddy.

パッケージディレクトリにいる場合は、パッケージへのパスを省略して、単に実行することができます go build.

実行可能ファイルに別の名前または場所を指定するには、 -o 国旗。 と呼ばれる実行可能ファイルを作成しましょう caddy-server そしてそれを build 現在の作業ディレクトリ内のディレクトリ:

  1. 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を使用してこれを試してください。

  1. go install github.com/mholt/caddy/caddy

と同じように go build、コマンドが成功した場合、出力は表示されません。 以前と同様に、実行可能ファイルはパッケージを含むディレクトリと同じ名前で作成されます。 ただし、今回は実行可能ファイルがに格納されます $GOPATH/bin. もしも $GOPATH/bin あなたの一部です $PATH 環境変数の場合、実行可能ファイルはオペレーティングシステムのどこからでも利用できます。 あなたはを使用してその場所を確認することができます which 指図:

  1. 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 ターゲットアーキテクチャ用。 実行可能ファイルを作成するには、コマンドは次の形式になります。

  1. env GOOS=target-OS GOARCH=target-architecture go build package-import-path

The env コマンドは、変更された環境でプログラムを実行します。 これにより、現在のコマンド実行にのみ環境変数を使用できます。 コマンドの実行後、変数は設定解除またはリセットされます。

次の表は、可能な組み合わせを示しています。 GOOSGOARCH 使用できます:

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ビットを構築できます。

  1. env GOOS=windows GOARCH=amd64 go build github.com/mholt/caddy/caddy

この場合も、操作が成功したことを示す出力はありません。 実行可能ファイルは、パッケージ名を名前として使用して、現在のディレクトリに作成されます。 ただし、この実行可能ファイルはWindows用に作成したため、名前は接尾辞で終わります .exe.

あなたが持っている必要があります caddy.exe 現在のディレクトリにあるファイル。 ls 指図。

  1. ls caddy.exe

が表示されます caddy.exe 出力にリストされているファイル:

Output
caddy.exe

:使用できます -o 実行可能ファイルの名前を変更するか、別の場所に配置するためのフラグ。 ただし、Windows用の実行可能ファイルを作成して別の名前を指定する場合は、必ず明示的に指定してください。 .exe実行可能ファイルの名前を設定するときの接尾辞。

複数のターゲット環境向けのソフトウェアをリリースしやすくするために、このプロセスのスクリプトを見てみましょう。

ステップ5—クロスコンパイルを自動化するスクリプトを作成する

多くのプラットフォームで実行可能ファイルを作成するプロセスは少し面倒ですが、スクリプトを作成して作業を簡単にすることができます。

スクリプトは、パッケージのインポートパスを引数として取り、オペレーティングシステムとプラットフォームのペアの事前定義されたリストを反復処理し、各ペアの実行可能ファイルを生成して、出力を現在のディレクトリに配置します。 各実行可能ファイルには、パッケージ名の後にターゲットプラットフォームとアーキテクチャが続く形式で名前が付けられます。 package-OS-architecture. これは、あらゆるプロジェクトで使用できるユニバーサルスクリプトになります。

ホームディレクトリに切り替えて、という新しいファイルを作成します go-executable-build.bash テキストエディタで:

  1. cd ~
  2. nano go-executable-build.bash

スクリプトはshebang行から始めます。 この行は、実行可能ファイルとして実行されたときにこのスクリプトを解析するインタープリターを定義します。 次の行を追加して、 bash このスクリプトを実行する必要があります:

go-executable-build.bash
#!/usr/bin/env bash

パッケージのインポートパスをコマンドライン引数として使用します。 これを行うには、 $n 変数、ここで n は非負の数です。 変数 $0 実行したスクリプトの名前が含まれていますが、 $1 以上には、ユーザー指定の引数が含まれます。 この行をスクリプトに追加します。これにより、コマンドラインから最初の引数が取得され、次の変数に格納されます。 package:

go-executable-build.bash
...
package=$1

次に、ユーザーがこの値を指定したことを確認します。 値が指定されていない場合は、スクリプトの使用方法を説明するメッセージを表示してスクリプトを終了します。

go-executable-build.bash
...

if [[ -z "$package" ]]; then
  echo "usage: $0 <package-name>"
  exit 1
fi

これ if ステートメントは、の値をチェックします $package 変数。 設定されていない場合は、 echo 正しい使用法を印刷してから、を使用してスクリプトを終了します exit. exit 引数として戻り値を取ります。 0 成功した実行の場合はゼロ以外の値、失敗した実行の場合はゼロ以外の値。 を使用しております 1 スクリプトが成功しなかったので、ここに。

:このスクリプトを事前定義されたパッケージで機能させる場合は、 package そのインポートパスを指す変数:

go-executable-build.bash
...
package="github.com/user/hello"

次に、パスからパッケージ名を抽出します。 パッケージのインポートパスは次のように区切られます / パスの最後にあるパッケージ名の文字。 まず、パッケージのインポートパスを配列に分割します。 / 区切り文字として:

go-executable-build.bash
package_split=(${package//\// })

パッケージ名は、この新しいの最後の要素である必要があります $package_split 配列。 Bashでは、負の配列インデックスを使用して、最初からではなく最後から配列にアクセスできます。 この行を追加して、配列からパッケージ名を取得し、それをという変数に格納します。 package_name:

go-executable-build.bash
...
package_name=${package_split[-1]}

次に、実行可能ファイルをビルドするプラットフォームとアーキテクチャを決定する必要があります。 このチュートリアルでは、Windows 64ビット、Windows 32ビット、および64ビットmacOS用の実行可能ファイルを作成します。 これらのターゲットを次の形式の配列に配置します OS/Platform、したがって、各ペアをに分割できます GOOSGOARCH パスからパッケージ名を抽出するために使用したのと同じ方法を使用する変数。 スクリプトにプラットフォームを追加します。

go-executable-build.bash
...
platforms=("windows/amd64" "windows/386" "darwin/amd64")

次に、プラットフォームの配列を繰り返し処理し、各プラットフォームエントリを次の値に分割します。 GOOSGOARCH 環境変数、およびそれらを使用して実行可能ファイルをビルドします。 私たちは次のようにそれを行うことができます for ループ:

go-executable-build.bash
...
for platform in "${platforms[@]}"
do
	...
done

The platform 変数には、からのエントリが含まれます platforms 各反復の配列。 分割する必要があります platform 2つの変数に- GOOSGOARCH. 次の行をに追加します for ループ:

go-executable-build.bash
for platform in "${platforms[@]}"
do
	platform_split=(${platform//\// })
	GOOS=${platform_split[0]}
	GOARCH=${platform_split[1]}
	
done

次に、パッケージ名とOSおよびアーキテクチャを組み合わせて、実行可能ファイルの名前を生成します。 Windows用に構築する場合は、 .exe ファイル名の接尾辞。 このコードをに追加します for ループ:

go-executable-build.bash
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 キーワード:

go-executable-build.bash
...
	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 キーワード。

go-executable-build.bash

...

	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パッケージから複数の実行可能ファイルをビルドするスクリプトができました。 完成したスクリプトは次のとおりです。

go-executable-build.bash

#!/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 指図:

  1. chmod +x go-executable-build.bash

最後に、Caddyの実行可能ファイルを作成して、スクリプトをテストします。

  1. ./go-executable-build.bash github.com/mholt/caddy/caddy

すべてがうまくいけば、現在のディレクトリに実行可能ファイルがあるはずです。 スクリプトが正常に実行されたことを示す出力はありません。 を使用して作成された実行可能ファイルであることを確認できます ls 指図:

  1. ls caddy*

3つのバージョンすべてが表示されます。

Example ls output
caddy-darwin-amd64 caddy-windows-386.exe caddy-windows-amd64.exe

ターゲットプラットフォームを変更するには、 platforms スクリプト内の変数。

結論

このチュートリアルでは、Goのツールを使用してバージョン管理システムからパッケージを取得する方法と、さまざまなプラットフォーム用の実行可能ファイルをビルドおよびクロスコンパイルする方法を学習しました。

また、多くのプラットフォーム用に単一のパッケージをクロスコンパイルするために使用できるスクリプトを作成しました。

アプリケーションが正しく動作することを確認するために、テストおよびTravis-CIAppVeyorなどの継続的インテグレーションを確認してテストできます。 Windowsの場合。

Caddyとその使用方法に興味がある場合は、 Ubuntu16.04でCaddyを使用してWebサイトをホストする方法を参照してください。