golang

Goのgo installをプロジェクトでどのように使っているか

こんにちは。 株式会社アプリボット、バックエンドエンジニアの辻拓也です。

今回は私が所属しているgolangで開発中の新規プロジェクトで、go installをどのように使っているのかについてご紹介します。

参考にしていただければ幸いです。

目次


  1. go installとは
  2. go installを使ってみる
  3. 実際にどのような場合に使っているのか
  4. おわりに

1.go installコマンドとは

まずは公式情報を見てみましょう。golangに限らずとりあえず始めに公式情報を確認する癖をつけておくと何かと良いかなと思います。

公式情報を確認するとCompile and install packages and dependenciesにgo installについての説明があります。

日本語に訳すと、

インポートパスで指定されたパッケージをコンパイルしてインストールします。 実行ファイルは環境変数GOBINが指定されている場合GOBINに、GOPATHが指定されている場合$GOPATH/binに、それ以外の場合$HOME/go/binにインストールされます。

https://golang.org/cmd/go/#hdr-Compile_and_install_packages_and_dependencies

と書かれています。 (私の日本語訳が間違っている可能性もありますので原文もぜひ見てみてください!)

私はこの説明を読んだときに、「go installはどのような場合にどうやって使うのか」という疑問がでました。なので手順を踏んで実際に使用して確認してみましょう。

2.go installを使ってみる

今回はサンプルとして現在時刻を表示するプログラムを書いてみました。

package main

import (
   "fmt"
   "time"
)

func main(){
   jst := time.FixedZone("Asia/Tokyo", 9*60*60)
   nowJST := time.Now().UTC().In(jst)
   fmt.Println(nowJST.Format(time.RFC3339))
}


構成は下記です。

now
└── main.go ← 現在時刻を表示するプログラミングを記述

nowディレクトリの中にmain.goを配置するだけという非常にシンプルな構成になっていて、main.goの中に現在時刻を表示するプログラムを記述しています。

カレントディレクトリをnowディレクトリにしてgo installを実行します。

# カレントディレクトリをnowディレクトリにしてから下記コマンドを実行
% go install

これで作業は完了です。go installを実行して何が行われたかというとCompile and install packages and dependenciesに書かれているように、「指定されたパッケージをコンパイルしてインストール」されているはずです。

「パッケージ」とはここでいうnowディレクトリのことです。

ではどこにインストールされたのでしょうか?それも

「実行ファイルは環境変数GOBINが指定されている場合GOBINに、GOPATHが指定されている場合$GOPATH/binに、それ以外の場合$HOME/go/binにインストールされます。」

Compile and install packages and dependenciesに書かれています。

私の場合は環境変数GOBINが設定されておらず、GOPATHが指定されていたのでgo installを実行したことにより$GOPATH/bin配下にnowという実行ファイルが作成されているはずです。

確認してみます。

% ls $GOPATH/bin | grep now
now

nowという実行ファイルが$GOPATH/bin配下に作成されていました!

ここまででgo installが無事に成功していることが分かります。

では最後に実行ファイルを実行してみます。

% now       
2021-03-18T09:24:11+09:00

想定通り現在時刻が表示されました!このことからgo installがどのような挙動なのかということが理解できたのではないかなと思います。

3.実際にどのような場合に使っているのか

実際にgo installをどのような場合にプロジェクトで使用しているのかというと
プロジェクトの自作コマンドラインツール(もちろんgolang製)を各々のローカル環境に配布するという用途に使用しています。
プロジェクトではsqlファイルの自動生成やコードの自動生成、その他様々なことに自作コマンドラインツールを使用しています。
新しくチームにジョインしてくれた人がgo installを実行しただけでプロジェクト自作コマンドラインツールがローカル環境に配置され、使用できるようになっています。

私が所属するプロジェクトではtoolsディレクトリというディレクトリが存在していて複数の自作コマンドラインツールがここに置いてあります。
実際にtoolsディレクトリ配下がどのような構成になっているかというと、 toolsディレクトリ配下に更にコマンドラインツールごとにディレクトリを作成していています。そうすることで複数のコマンドラインツールを配置することが可能になります。
イメージとして下記構成になります。ディレクトリ名は実際にプロジェクトで使用しているものではなく仮名です。

project-root
└── tools ← 複数のプロジェクト自作コマンドラインツールが置いてある
    └── sql_generate ← sqlの自動生成コマンドラインツール
        └── main.go
    └── go_generate ← golangのコード自動生成コマンドラインツール
        └── main.go
└── Makefile ← 様々なコマンドをまとめてある

実際にはgo installを直接実行するわけではありません。Makefileの中でinstallというターゲットを用意しており、その中の1つとしてgo installが記載されています。installというターゲットには様々なインストールコマンドが書かれていて最初にチームにジョインしてくれた人がmake installを実行すれば環境が出来上がるというよくあるやつです。
このような構成にすることで、新しくチームにジョインしてくれた人でもストレスなくプロジェクト自作コマンドラインツールをすぐに使用できるようになっています。
一つ難点なのが、自作コマンドラインツールの更新(ソースコードの修正・変更)をした際に各々のローカル環境で再度go installを実行して最新のバージョンをコンパイル&インストールする必要があるということです。

が逆に言うとそれ以外では特に問題なく運用出来ているので引き続きこの構成でやっていこうと思っています。

4.おわりに

初めてgolangに触れたときにgo installの公式説明を読んで、「これはどうやって使うんだろう」と思ったことがあったのと、go installの実際の使用例に関してあまり目にしなかったこともあり今回プロジェクトでのgo install使用例を書かせてもらいました。
これからgolangを始めてみようという人や既にgolangを使っている人の参考になれば幸いです。

自分自身もまだまだgolangを使い続けていくので、何か報告できることがあればまた書きたいと思っています!
最後まで読んでいただきありがとうございました!

※ アイキャッチ画像のgopherはRenee Frenchがデザインしました。このデザインは、Creative Commons 3.0 Attributionsライセンスに基づいています。


関連記事一覧

  1. この記事へのコメントはありません。