【边编码,边更新】命令行工具 Bra 介绍 前言 使用示例 配置文件 总结

Bra(Brilliant Ridiculous Assistant)是一个个人维护的命令行工具项目。它能让开发者在编写代码的同时,实时编译、更新、加载 golang 代码,从而即时地看到新代码产生的效果。Bra 极大地提高了开发效率,非常适合 Go Web 后端开发。Grafana 项目就使用了该工具。Bra 项目地址:https://github.com/unknwon/bra

使用示例

本示例演示一个简单 Web 应用。该应用在浏览器上打印 Hello World。当我们通过修改打印信息代码时,Bra 工具会触发重启,便可在浏览器上查看到代码最新效果。

package main

import (
	"io"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
		io.WriteString(w, "Hello World!")
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}

接下来,我们应让 Bra 工具来启动上面的 Web 应用。这需要执行 Bra 二进制程序的 run 命令,以及配置 .bra.toml 文件(该文件是 Bra 依赖的配置文件)。配置 .bra.toml 文件中定义了一些规则包括:启动程序的命令、需要监控变化的文件夹路径、可忽略的无须监控的文件名等。示例使用的 .bra.toml 如下:

[run]
init_cmds = [                      # 启动时执行的命令
  ["go", "build", "-o=server", "main.go"],
  ["./server"]
]
watch_all = true                   # 是否监控子目录
watch_dirs = []                    # 需要监控的目录
watch_exts = [".go"]               # 需要监控文件的扩展名
env_files = []                     # 载入环境变量
ignore = [".git", "node_modules"]  # 忽略的文件目录
ignore_files = []                  # 忽略的文件名
follow_symlinks = false            # 是否考虑软连接
build_delay = 1500                 # 为避免重复触发命令执行,两次触发事件的最小时间间隔(毫秒)
interrupt_timout = 15              # 超时终止
graceful_kill = false              # 是否优雅退出
cmds = [                           # 触发时执行的命令
  ["go", "build", "-o=server", "main.go"],
  ["./server"]
]

然后,准备 bra 二进制程序,可以通过如下命令构建:

go mod init
go build -o bra github.com/unknwon/bra

最终,示例代码项目结构如下。你可以通过 ./bra run 来运行配置文件中声明的命令,启动 Web 应用,修改打印信息,查看效果 http://localhost:8080

.
├── bra
├── go.mod
├── go.sum
└── main.go

配置文件

配置文件 .bra.toml 支持一些内置变量,如 $WORKDIR 可用于 watch_dirs 中。

总结

Bra 工具很实用,但也有局限性。相关能力限制可查看 issue,比如不能并行执行多个进程,像上面实例中,你不能启动 Web 应用的同时,打印 echo。