序章

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

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

前提条件

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

ステップ1—簡単なGoプログラムを作成する

Goがインストールされたので、Hello, World!の作成を試すことができます。

まず、Goワークスペース用の新しいディレクトリを作成します。このディレクトリにGoがファイルを作成します。

  1. mkdir hello

次に、作成したディレクトリに移動します。

  1. cd hello

パッケージをインポートするときは、コード自体のモジュールを介して依存関係を管理する必要があります。 これを行うには、go mod initコマンドを使用してgo.modファイルを作成します。

  1. go mod init hello

次に、お好みのテキストエディタでHello, World!Goファイルを作成します。

  1. nano hello.go

次のテキストをhello.goファイルに追加します。

hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

次に、CTRL+XYENTERの順に押して、ファイルを保存して閉じます。

コードをテストして、Hello, World!グリーティングが出力されることを確認します。

  1. go run .
Output
Hello, World!

go runコマンドは、作成した新しいhelloディレクトリとインポートしたパスの.goソースファイルのリストからGoパッケージをコンパイルして実行します。 ただし、go buildを使用して、時間を節約できる実行可能ファイルを作成することもできます。

ステップ2—実行可能ファイルを作成する

go runコマンドは、「Hello、World!」のコードを実行しました。 プログラムですが、ソースからだけでなく、システム上のどこでも実行できるように、プログラムをバイナリにビルドすることをお勧めします。 go buildコマンドは、実行可能ファイルをビルドします。

  1. go build hello

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

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

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

  1. go build -o build/hello hello

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

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

ステップ3—実行可能ファイルのインストール

実行可能ファイルを作成すると、現在のディレクトリまたは選択したディレクトリに実行可能ファイルが作成されます。 実行可能ファイルのインストールは、実行可能ファイルを作成して$GOPATH/binに保存するプロセスです。 go installコマンドはgo buildと同じように機能しますが、go installが出力ファイルを適切な場所に配置します。

実行可能ファイルをインストールするには、go installに続けて、パッケージのインポートパスを使用します。 もう一度、「Hello、World!」を使用してくださいこれを試すプログラム:

  1. go install hello

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

  1. which hello

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

Output of which
/home/sammy/go/bin/hello

go getgo build、およびgo installがどのように機能し、それらがどのように関連しているかを理解したところで、最も人気のあるGo機能の1つである他のターゲットの実行可能ファイルの作成について見ていきましょう。プラットフォーム。

ステップ4—さまざまなアーキテクチャの実行可能ファイルを構築する

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

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

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

go buildコマンドを実行する前に、OSとアーキテクチャを設定します。 これにより、現在のコマンド実行にのみ環境変数を使用できます。 コマンドの実行後、変数は設定解除またはリセットされます。

実行可能ファイルの構築に使用できるオペレーティングシステムとプラットフォームを確認するには、distツールを使用できます。

  1. go tool dist list

これにより、/文字で区切られたオペレーティングシステムとアーキテクチャのリストが提供されます。

Output
aix/ppc64 android/386 android/amd64 android/arm android/arm64 darwin/amd64 darwin/arm64 dragonfly/amd64 freebsd/386 freebsd/amd64 freebsd/arm freebsd/arm64 illumos/amd64 ios/amd64 ios/arm64 js/wasm linux/386 linux/amd64 linux/arm linux/arm64 linux/mips linux/mips64 linux/mips64le linux/mipsle linux/ppc64 linux/ppc64le linux/riscv64 linux/s390x netbsd/386 netbsd/amd64 netbsd/arm netbsd/arm64 openbsd/386 openbsd/amd64 openbsd/arm openbsd/arm64 openbsd/mips64 plan9/386 plan9/amd64 plan9/arm solaris/amd64 windows/386 windows/amd64 windows/arm

警告: Android用の実行可能ファイルのクロスコンパイルには、 Android NDK と、このチュートリアルの範囲を超える追加のセットアップが必要です。

リスト内の値を使用して、次のようにWindows64ビット用のhelloを構築できます。

  1. GOOS=windows GOARCH=amd64 go build hello

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

現在のディレクトリにhello.exeファイルがあり、lsコマンドで確認できます。

  1. ls hello.exe

hello.exeファイルが出力に表示されます。

Output
hello.exe

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

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

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

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

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

プロジェクトのディレクトリ内に、テキストエディタでgo-executable-build.bashという名前の新しいファイルを作成します。

  1. 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の形式で配列に配置するため、パッケージ名の抽出に使用したのと同じ方法を使用して、各ペアを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配列からのエントリが含まれます。 platformGOOSGOARCHの2つの変数に分割する必要があります。 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 build0以外を返す場合は、問題があるため、スクリプトを終了します。 このコードを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

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

  1. ./go-executable-build.bash hello

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

  1. ls hello*

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

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

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

結論

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

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

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