Help us understand the problem. What is going on with this article?

goのhot-reload

テックタッチアドベントカレンダー 7日目担当の@analogrecordです。
前回は@ihiroky氏による「JSXとvirtual-domで遊ぶ」でした。
記事の分量・濃い内容ともに圧倒されています。流石です…

フロントエンドの記事が続いていますが、今回はバックエンドのTIPを紹介していこうと思います。

動機

テックタッチではサーバーサイドにgoを使用しています。
私自身テックタッチに入社するまではずっとphpとjsを書いていたため、エディタで編集してブラウザ等で即実行して挙動を確認する開発に慣れてしまっていました。
goおよびコンパイル言語を扱うのが初めてなので、少し書き直してビルドするとすぐにビルドエラーに阻まれ…どの変更によってエラーになっているのかわからなくなってしまったり、ビルドして実行できても出力結果が想定と違っている等、var_dump()してリロードすればデバッグできたphpに比べてストレスを感じていました。

調べてみるとタスクランナーのfilewatch機能を使用して、ファイル変更検知後にbuildタスクを起動してhot-reloadを実現するライブラリがありました。
いくつか試したなかでファイルの変更検知が早いrealizeがしっくり来たのでご紹介します。
go-taskも開発が活発なため魅力的でしたが、私が試した時点ではファイル変更検知までの時間がrealizeよりワンテンポ遅く感じます。

サンプル

docker-composeでechoを使用したwebサーバのhot-reloadが試せるサンプルを用意しました。
https://github.com/mochibuta/echo-realize

リポジトリをクローン後、docker-compose upでechoサーバーが立ち上がります

~/Dev/go/src/github.com/mochibuta/echo-realize $ docker-compose up                                                                                                                                                          7.3s
WARNING: Native build is an experimental feature and could change at any time
Creating network "echo-realize_default" with the default driver
Creating echo-realize_server_1 ... done
Attaching to echo-realize_server_1
server_1  | [18:29:49][SERVER] : Watching 1 file/s 1 folder/s
server_1  | [18:29:49][SERVER] : Install started
server_1  | [18:29:50][SERVER] : Install completed in 1.015 s
server_1  | [18:29:50][SERVER] : Running..
server_1  | [18:29:50][SERVER] :    ____    __
server_1  | [18:29:50][SERVER] :   / __/___/ /  ___
server_1  | [18:29:50][SERVER] :  / _// __/ _ \/ _ \
server_1  | [18:29:50][SERVER] : /___/\__/_//_/\___/ v4.1.11
server_1  | [18:29:50][SERVER] : High performance, minimalist Go web framework
server_1  | [18:29:50][SERVER] : https://echo.labstack.com
server_1  | [18:29:50][SERVER] : ____________________________________O/_______
server_1  | [18:29:50][SERVER] :                                     O\
server_1  | [18:29:50][SERVER] : ⇨ http server started on [::]:1323

この状態でhttp://localhost:1323 へアクセスするとHello, World!が出力される単純なものです。

.realize.yaml
settings:
  legacy:
    force: false
    interval: 100ms
schema:
  - name: server
    path: .
    commands:
      install:
        status: true
        method: go build -x -o /opt/server
      run:
        status: true
        method: /opt/server
    watcher:
      extensions:
        - go
      paths:
        - /
      ignored_paths:
        - .git
        - .realize
        - vendor

realizeの設定は.goの拡張子のファイルの変更をウォッチし、go runまたはgo installするようになっています。

サンプルではdocker-compose up時にrealize start --runが行われるので、main.goに変更を加えると即座にgo runしなおしてくれます。

ここから更にdelveデバッグ用ビルドもhot-reloadするように設定もでき、より快適に動作を確認しながらコードの改修ができるようになります。

参考でより詳しく解説されていますのでご興味のあるかたはそちらも併せて御覧ください。


明日は@ikazo_yによる「プロダクション readyなRedash on ECSを5分で立ち上げるためのCfn templateを作った話」です!超楽しみ

参考

techtouch
「テックの力を最大化する」をミッションに掲げ、ヒトとテクノロジーの架け橋となるサービスを提供します。
https://techtouch.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした