ローカル開発環境で複数のGoプログラムを効率よく開発する

by

@wapa5pow

ogp
(Introducing Foremanより)

1年くらいGo言語を使って開発しているのですが以下の点で不満に思うようになってきました。

  • ソースコードを変えたときにhot reloadをしてくれない。Nuxt.jsやRailsなどソースコードを変えるとhot reloadしてくれるのですが、Goはデフォルトでは何もしてくれないのでいちいち立ち上げ直す必要がある
  • アプリ用のバックエンド・管理画面用のバックエンドなど複数のGoプログラムがあり、プログラムごとにターミナルを開いて、go run app/rpc/*goなどとして複数のターミナルを開く必要があり面倒だし時間がかかる

上記を改善するためにhot reloadをrealizeを使って行って解決し、複数のプログラムを1つのターミナルで実行するためにforemanを利用しました。

docker-composeを利用することも考えたのですが、GCPを利用していることもあり、認証の扱いをどうするのかと、hot reloadの設定をDockerfileにかかなければならないというのが懸念でやめました。

realize

realizeはGo言語のプログラムのhot reloadを簡単に実現してくれます。例えばapp/rpc/main.goというプログラムがあったとすると、realize start --run --path="app/rpc/" --no-configと実行するだけでhot reloadが実現できます。

残念なところとしては、Go言語側で、色つきの文字を標準出力に出していてもrealizeが決めた同じ色表示されてしまいます。またGo言語しか対応していないので他の言語でやりたいときは他の方法で行う必要があります。今回は、Go以外のプログラムはhot reloadできているのと、realizeはGoのプログラムしか動かせないので、hot reloadのみの機能として利用しています。

realizeはコマンドラインのみで実行する以外の方法として、.realize.yamlファイルを作って、そこに複数のプログラム用の設定をかいて、realize startとして実行することもできます。

hot reloadは他にも、CompileDaemonを使ったり、ginを使ったりいろいろなやり方があります。ginはポートプロキシする感じなので、gRPCで使えなかったのと、ポートが増えるのでやめました。

foreman

foremanは、プロジェクトのroot直下などにに以下のようなProcfileを作成して、foreman startとすれば複数のプログラムを1つのターミナルのみで動かせるようになります。

title=Procfile
frontend: cd backend && npm run dev
backend: realize start --run --path="app/rpc/" --no-config

foremanはgemでインストールしなければいけないのでちょっと面倒な場合は、他の言語でかかれたPortsがたくさんあるので好きなのを使えばいいかなと思います。同じProcfileでPortsにある各種プログラムで実行できるので楽ちんです。

各種みてみたらHivemindがProcfileで動かしたプログラムの標準出力のカラーをそのまま出してくれるのでおすすめです。自分はこれで動かしています。

あとがき

Go言語での開発を効率化するために、hot reloadをrealizeを使って解決し、複数プログラムの実行をforemanを使って解決しました。
いままで複数のプログラムを複数のターミナルを立ち上げて、ソースコードがかわるたびに立ち上げ直していたのが、hivemindとたたくだけで複数プログラムがいっきに実行されhot reloadする環境にできました。

Goの開発環境に困っている場合は試してみてください。