用 go 写了个查看 html 文档的命令行工具

2023年 10月 12日 80.7k 0

dart 和 rust 的语言都有文档生成功能,可以从注释中生成 html 格式的文档。但是很不巧的是,它们都没有提供 http 访问的工具。本地开发时只能对着 index.html 干瞪眼。虽说借助 docker 也能启动一个文档服务器,比如 docker run -it --rm -p 80:80 -v ./doc/api/:/usr/share/nginx/html nginx 。但敲这么长的命令确实有点考验记忆力。所以我写个脚本美滋滋开发了个轮子,用于查看 html 文档(文档链接)。

dart,您猜猜我的眼睛👀能不能直接渲染 html?

其实 go 写这个超简单的,下面这行代码一行就能搞定。

_ = http.ListenAndServe(":9090", http.FileServer(http.Dir("doc/api")))

但要将其写成工具的话,考虑的事情就多了。返回的 error 要处理;端口和本地目录要写成活的;要打印实际监听的端口(传入 ":0" 代表随机选择端口监听所以不能直接打印传入的参数)……最后就写成了这样。

var (
addr string // serve address
dir string // root path
)

func init() {
flag.StringVar(&addr, "addr", "localhost:9090", "serve address")
flag.StringVar(&dir, "dir", ".", "root path")
}

func main() {
flag.Parse() // 标准库 flag 包自带 -h 和 --help 适配,不用单独写。

l, err := net.Listen("tcp", addr)
if err != nil {
log.Fatal(err)
}
defer l.Close()

ctx := context.Background()
ctx, stop := signal.NotifyContext(ctx, os.Interrupt)
defer stop()

s := http.Server{
Handler: http.FileServer(http.Dir(dir)),
}

var wg sync.WaitGroup // 虽然有点画蛇添足,但加了个 kill 适配。这种写法可以作为其他项目的参考。
wg.Add(1)
go func() {
defer wg.Done()
log.Printf("Serve at http://%sn", l.Addr()) // 打印的是实际监听的端口,避免 ":0" 的问题
err = s.Serve(l)
}()

wg.Add(1)
go func() {
defer wg.Done()

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论