Go 言語でコードをコンパイルし、ローカルにインストールする
はじめに
当エントリは以下のエントリの続きとなっています。
- Go 言語でパッケージを自作して、それを呼び出してみる – その 1 | Go 言語用ポストイット
- Go 言語でパッケージを自作して、それを呼び出してみる – その 2 | Go 言語用ポストイット
- Go 言語でエラーを返却し、受け取った側で適切に処理する | Go 言語用ポストイット
- Go 言語でランダムな文字列を返却する(
math/rand
ライブラリ ) | Go 言語用ポストイット - Go 言語で map ( Key-Value 型の仕組み ) をサンプルコードを通して理解する | Go 言語用ポストイット
- 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 に書き直してさらなる理解を深めていきたいと思います。
お付き合いありがとうございました!
ディスカッション
コメント一覧
まだ、コメントがありません