Go 言語でコードをコンパイルし、ローカルにインストールする

はじめに

当エントリは以下のエントリの続きとなっています。

チュートリアルエントリの最後では、 go のサブコマンドについて学んでいきます。

go run コマンドはコードのコンパイルと実行のための便利なショートカットではありますが、実行可能なバイナリファイルを生成するわけでは有りません。

当エントリでは、以下の 2 つの新しいコマンドを紹介します。

  • go build : パッケージをコンパイルします。コンパイルの際には依存ライブラリも同梱されます。
  • go install : コンパイルとインストールを同時に行います。

早速作業を始めてみよう!

1. hello ディレクトリで go build コマンドを実行

$ basename $PWD
hello

$ go build

$ ls -l
total 2016
-rw-r--r-- 1 root root     135 Apr 23 12:16 go.mod
-rwxr-xr-x 1 root root 2055550 May  5 23:01 hello
-rw-r--r-- 1 root root     281 May  4 00:12 hello.go

2. hello ディレクトリで、 生成された hello ファイルを実行

動作確認してみます。

Linux または Mac 環境の場合

$ ./hello
map[genzouw:Hail, genzouw! Well met! misaki:Hi, misaki. Welcome! tsubasa:Great to see you, tsubasa!]

Windows 環境の場合

$ hello.exe
map[genzouw:Hail, %!v(MISSING)! Well met! misaki:Great to see you, %!v(MISSING)! tsubasa:Hail, %!v(MISSING)! Well met!]

実行可能ファイルは コンパイルした OS と実行する OS が同じ環境であればgo コマンドが使えない環境でも実行することができます。
試しにクリーンな Ubuntu 環境で実行してみましょう。

# クリーンなUbuntu環境を立ち上げる
$ docker run --rm -it -v $PWD:/app --workdir /app ubuntu bash

# goコマンドはインストールされていない
$ go version
bash: go: command not found

# helloという実行可能ファイルが存在している。(Ubuntu環境で事前にコンパイルしたもの)
$ ls -la
total 2024
drwxr-xr-x  6 root root     192 May  6 00:14 .
drwxr-xr-x  1 root root    4096 May  6 00:14 ..
drwxr-xr-x 10 root root     320 May  6 00:14 .git
-rw-r--r--  1 root root     135 Apr 23 12:16 go.mod
-rwxr-xr-x  1 root root 2059590 May  6 00:14 hello
-rw-r--r--  1 root root     281 May  4 00:12 hello.go

# 実行
$ ./hello
map[genzouw:Great to see you, genzouw! misaki:Hi, misaki. Welcome! tsubasa:Hail, tsubasa! Well met!]

これにて、パッケージをコンパイルし実行可能ファイルを作成することができました。

ただし、実行するためには、実行可能ファイルを相対パスか絶対パスで指定する必要があります。

相対パスや絶対パスを指定せずともアプリケーションを実行できるようにするために、 go install してみましょう。

3. go コマンドがパッケージをインストールする場所を確認

go list コマンドを使うと、 Go アプリケーションがインストールされるパスを確認することができます。

# カレントディレクトリ
$ pwd
/home/genzouw/hello

# Goアプリケーションがインストールされる場所
$ go list -f '{{.Target}}'
/home/genzouw/go/bin/hello

# Goアプリケーションがインストールされるディレクトリ
$ dirname $(go list -f '{{.Target}}')
/home/genzouw/go/bin

# まだアプリケーションは存在しない
$ ls -la /home/genzouw/go/bin/hello
ls: cannot access '/home/genzouw/go/bin/hello': No such file or directory

Go インストールされるディレクトリの情報は、次のステップで利用します。

4. PATH 環境変数に Go のアプリケーションインストールディレクトリを追加

Go アプリケーションのインストールディレクトリをパスに追加します。

Linux または Mac の場合は、 以下のいずれかのコマンドで設定可能です。

export PATH="$PATH:/home/genzouw/go/bin"
export PATH="$PATH:$(dirname $(go list -f '{{.Target}}'))"

Windows の場合は省略します。

ちなみに、インストールディレクトリを既存のディレクトリに変更してしまう事もできます。

例えば、 $HOME/bin のようなディレクトリにインストールしてしまう方が管理しやすい、といった都合があれば、 go env コマンドを実行し Go 用の環境変数のデフォルト値を上書きできます。

$ go env -w GOBIN="$HOME/bin"

go env -w で設定した環境変数はファイルに設定されます。
設定ファイルのパスは以下のコマンドで確認できます。

# /root/.config/go/env に設定ファイルがある
$ go env GOENV
/home/genzouw/.config/go/env

5. インストール!

準備が終わったら、いよいよインストールです。

$ go install

何も出力されないので不安ですが、次のステップへ進みましょう。

6. パスを指定せずにアプリケーションを実行

先程は相対パスでアプリケーションを呼び出しましたが、アプリケーション名だけをタイプして実行して見ましょう。

$ hello
map[genzouw:Hail, genzouw! Well met! misaki:Hi, misaki. Welcome! tsubasa:Great to see you, tsubasa!]

どこに実行ファイルが配置されたのかも確認してみましょう。

$ which hello
/home/genzouw/go/bin/hello

想定通りの場所ですね。

ひとこと

簡単なコマンドラインアプリケーションが作成できるようになりました。

ちょっとずつ既存のコードを Go に書き直してさらなる理解を深めていきたいと思います。

お付き合いありがとうございました!

Posted by genzouw