zoukankan      html  css  js  c++  java
  • 【边编码,边更新】命令行工具 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。

  • 相关阅读:
    Java动态代理(三)——模拟AOP实现
    Java动态代理(二)CGLIB动态代理应用
    Java动态代理(一)动态类Proxy的使用
    CGLIB实现动态代理
    初识Java微信公众号开发
    spring+ibatis事务管理配置
    什么是事务的传播特性
    Spring事务配置的五种方式
    Java语言基础(五) Java原始数据类型的分类以及数据范围
    Java语言基础(四) String和StringBuffer的区别
  • 原文地址:https://www.cnblogs.com/huanggze/p/12525136.html
Copyright © 2011-2022 走看看