Ubuntu 16.04で複数のプラットフォーム用のGo実行可能ファイルをビルドする方法

前書き

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

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

前提条件

このチュートリアルを実行するには、次のものが必要です。

手順1-バージョン管理からGoプログラムをインストールする

Goパッケージから実行可能ファイルを作成する前に、そのソースコードを取得する必要があります。 `+ go get `ツールは、GitHubなどのバージョン管理システムからパッケージを取得できます。 内部では、 ` go get `はパッケージを ` $ GOPATH / src / `ディレクトリのサブディレクトリに複製します。 次に、該当する場合は、実行可能ファイルをビルドして ` $ GOPATH / bin `ディレクトリに配置することにより、パッケージをインストールします。 前提条件のチュートリアルの説明に従ってGoを設定した場合、 ` $ GOPATH / bin `ディレクトリが ` $ PATH +`環境変数に含まれているため、システム上のどこからでもインストール済みパッケージを使用できます。

`+ go get `コマンドの構文は ` go get `です。 `+`はパッケージを一意に識別する文字列です。 多くの場合、Githubなどのリモートリポジトリ内のパッケージの場所、またはマシンの `+ $ GOPATH / src / +`ディレクトリ内のディレクトリです。

一般に、 `+ go get `を ` -u `フラグと共に使用して、 ` go get +`にパッケージとその依存関係を取得するか、既にマシンに存在する場合はそれらの依存関係を更新するよう指示します。

このチュートリアルでは、Goで書かれたWebサーバーであるhttps://github.com/mholt/caddy[Caddy]をインストールします。 Caddy’s instructions xに従って、パッケージのインポートパスに「+ github.com / mholt / caddy / caddy 」を使用します。 ` go get +`を使用してCaddyを取得してインストールします。

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

コマンドの完了には時間がかかりますが、パッケージを取得してインストールする間、進行状況は表示されません。 実際には、コマンドが正常に実行されたことを示す出力はありません。

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

which caddy

次の出力が表示されます。

Output

Goパッケージのインストールプロセスを詳しく見てみましょう。まず、既に入手したパッケージから実行可能ファイルを作成します。

ステップ2-実行可能ファイルの構築

`+ go get `コマンドはソースをダウンロードし、Caddyの実行可能ファイルを1つのコマンドでインストールしました。 ただし、実行可能ファイルを自分で再構築するか、独自のコードから実行可能ファイルをビルドすることができます。 ` go build`コマンドは実行可能ファイルをビルドします。

Caddyは既にインストールされていますが、プロセスに慣れるために、手動で再度ビルドしてみましょう。 `+ go build +`を実行し、パッケージのインポートパスを指定します。

go build github.com/mholt/caddy/caddy

前と同じように、操作の成功を示す出力はありません。 実行可能ファイルは、パッケージを含むディレクトリと同じ名前で、現在のディレクトリに生成されます。 この場合、実行可能ファイルの名前は「+ caddy +」になります。

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

実行可能ファイルに別の名前または場所を指定するには、「-o +」フラグを使用します。 ` caddy-server `という実行可能ファイルをビルドして、現在の作業ディレクトリ内の ` build +`ディレクトリに配置します。

go build -o  github.com/mholt/caddy/caddy

このコマンドは、実行可能ファイルを作成し、存在しない場合は「++」ディレクトリも作成します。

次に、実行可能ファイルのインストールを見てみましょう。

手順3-実行可能ファイルのインストール

実行可能ファイルをビルドすると、現在のディレクトリまたは選択したディレクトリに実行可能ファイルが作成されます。 実行可能ファイルのインストールは、実行可能ファイルを作成し、それを `+ $ GOPATH / bin `に保存するプロセスです。 「 go install」コマンドは「+ to 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

「+ go get 」、「 go build 」、および「 go install +」がどのように機能し、どのように関連しているかを理解したので、最も人気のあるGo機能の1つである、他のターゲットプラットフォーム用の実行可能ファイルを作成します。

手順4-さまざまなアーキテクチャの実行可能ファイルを構築する

`+ go build`コマンドを使用すると、go_がサポートするターゲットプラットフォーム用の実行可能ファイルをplatform_にビルドできます。 つまり、使用するターゲットプラットフォームで実行可能ファイルをビルドすることなく、アプリケーションをテスト、リリース、および配布できます。

クロスコンパイルは、ターゲットオペレーティングシステムとアーキテクチャを指定する必要な環境変数を設定することにより機能します。 ターゲットオペレーティングシステムには変数「+ GOOS 」を使用し、ターゲットアーキテクチャには「 GOARCH +」を使用します。 実行可能ファイルをビルドするには、コマンドは次の形式を取ります。

env GOOS= GOARCH= go build

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

次の表に、使用可能な「+ GOOS 」と「 GOARCH +」の可能な組み合わせを示します。

GOOS - Target Operating System GOARCH - Target Platform

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

表の値を使用して、次のようにWindows 64ビット用のCaddyを構築できます。

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

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

現在のディレクトリに + caddy.exe`ファイルがあるはずです。これは、 + ls`コマンドで確認できます。

ls caddy.exe

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

Outputcaddy.exe

このプロセスをスクリプト化して、複数のターゲット環境向けにソフトウェアを簡単にリリースできるようにします。

手順5-クロスコンパイルを自動化するスクリプトの作成

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

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

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

cd ~
nano

_shebang_行でスクリプトを開始します。 この行は、実行可能ファイルとして実行されるときにこのスクリプトを解析するインタープリターを定義します。 次の行を追加して、 `+ bash +`がこのスクリプトを実行するように指定します。

go-executable-build.bash

#!/usr/bin/env bash

パッケージのインポートパスをコマンドライン引数として使用します。 これを行うには、変数「+ $ 」を使用します。「+」は非負の数です。 変数「+ $ 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」を使用します。

次に、パスからパッケージ名を抽出します。 パッケージのインポートパスは「+ / 」文字で区切られ、パッケージ名はパスの末尾に配置されます。 最初に、区切り文字として「 / +」を使用して、パッケージインポートパスを配列に分割します。

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の実行可能ファイルをビルドします。 これらのターゲットをフォーマット「+ / 」の配列に配置します。そのため、パスからパッケージ名を抽出するために使用したのと同じ方法を使用して、各ペアを「 GOOS 」変数と「 GOARCH +」変数に分割できます。 プラットフォームをスクリプトに追加します。

go-executable-build.bash

...
platforms=("windows/amd64" "windows/386" "darwin/amd64")

次に、プラットフォームの配列を反復処理し、各プラットフォームエントリを「+ GOOS 」および「 GOARCH 」環境変数の値に分割し、それらを使用して実行可能ファイルをビルドします。 次の ` for`ループでそれを行うことができます:

go-executable-build.bash

...
for platform in "${platforms[@]}"
do
   ...
done

+ platform +`変数には、各反復で `+ platforms +`配列からのエントリが含まれます。 `+ platform`を2つの変数- + GOOS`と `+ GOARCH`に分割する必要があります。 次の行を「+ for」ループに追加します。

go-executable-build.bash

for platform in "${platforms[@]}"
do




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]}






done

変数を設定したら、 `+ go build`を使用して実行可能ファイルを作成します。 次の行を `+ done `キーワードのすぐ上の ` for +`ループの本文に追加します。

go-executable-build.bash

...
   if [ $GOOS = "windows" ]; then
       output_name+='.exe'
   fi



done

最後に、実行可能ファイルのビルド中にエラーが発生したかどうかを確認する必要があります。 たとえば、ソースを持たないパッケージをビルドしようとすると、エラーが発生する可能性があります。 「+ go build」コマンドの戻りコードでゼロ以外の値を確認できます。 変数 `+ $?`には、前のコマンドの実行からの戻りコードが含まれています。 「 go build 」が「+0」以外を返す場合、問題があったため、スクリプトを終了します。 このコードを、「+ go build」コマンドの後、「+ done 」キーワードの上にある「 for」ループに追加します。

go-executable-build.bash

...

   env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name $package

これで、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`コマンドで実行可能にする必要があります。

chmod +x .bash

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

./.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のツールを使用してバージョン管理システムからパッケージを取得する方法と、さまざまなプラットフォーム用の実行可能ファイルをビルドおよびクロスコンパイルする方法を学びました。

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

アプリケーションが正しく動作することを確認するには、* https://golang.org/pkg/testing/ [testing] *およびhttps://travis-ci.org [Travis-CIのような*継続的な統合*をご覧ください。 ]およびhttps://www.appveyor.com/[AppVeyor] Windowsでのテスト用。

Caddyとその使用方法に興味がある場合は、https://www.digitalocean.com/community/tutorials/how-to-host-a-website-with-caddy-on-ubuntu-16-をご覧ください。 04 [Ubuntu 16.04でCaddyを使用してWebサイトをホストする方法]。

Related