使用fswatch工具进行golang的热编译

lazykoala 发布于2年前
0 条问题

这个是做什么用的?

fswatch是一个工具, 通过检测文件的变化,并触发指定的命令

为什么需要fswatch

写完代码最重要的事情之一, 就是检测一下写好的代码是不是能够工作. 要早提前做的话, 收效越好, 发现的问题越多. 但是如果每次都需要make test, 每次都去编译或者测试的话, 还是挺烦人的. 所以如果能有一个自动化的工具去做的话, 那将是件很爽的事情.

最近我在忙一个项目, 经常性的需要, 停下来, 编译一下代码,看看能不能work. 真是烦死人了. 于是我就写了fswatch这个工具, 但是这种东西, 在我写第一版的时候写的不太好, 易用性太差, 可悲的是我却不知怎么去改进. 有人14个人star过我的这个小项目, 但我总感觉对不起他们. 真恨不得某一天删掉这么一坨shit的代码.

事情在某一天终于有了转机, 周末我研究了下sublime text2. 我过去只是听说它但没有真正的用过. sublime text2 有很多的配置文件(json格式的), 你只需要配置好, 就可以万事大吉了. 把配置拷贝到其他电脑上, 也能很好的work. 看来配置文件真是个好东西啊.

曾有人fork了我的那个fswatch工具, 把fswatch改成一个配置文件的方式, 但是改的很简单, 当时我没有在意. 但现在看来,配置文件的方式真的很nice, 你只需要在项目下建立一个.fswatch.json的配置文件, 进行一次参数的调整. 以后只需要运行fswatch就可以了. 多么简单的一个道理,理解起来去花了这么久.

于是边想边做, 想通的当天晚上就将原来代码中将近80%的垃圾代码清理了, 只留下20%的核心, 然后加上了配置文件生成和加载的代码, 将原来重启程序时的kill改成的group-kill. 很不幸的是 目前group-kill只能在mac和linux上跑的很好, 我暂时也没想到神马好的办法, 能让他在win上也ok运行.

目前拿这个fswatch替代bee, 实时的去编译运行c,cpp,java,golang等等, 应该都不是问题. 但是和bee比有什么优势呢?

既然大神问了,我就列举下:

  1. bee只适合Go语言; 而fswatch可以适用各种语言, 甚至是文件的远程同步
  2. bee可以通过配置指定监控的文件夹; fswatch可以配置监控的文件夹并指定监控的深度(0代表当前目录)
  3. bee可以指定监控文件的后缀; fswatch支持使用正则表达式, 来过滤监控到的文件.
  4. bee.json需要重其他地方拷贝;但是fswatch.json可以自动生成出来.
  5. fswatch支持group-kill. 这样可以确保fswatch停止后,不会有垃圾进程的存在.
  6. fswatch会根据程序的运行时间自动判断, 是否为服务端程序, 并适当的修改重启策略.
  7. bee功能庞大; fswatch的代码精简.

上手使用

配置文件比较长, 但是可以用fswatch自动去生成. fswatch 直接运行这个命令就可以. 然后你会在目录下面发下一个.fswatch.json文件. 内容大致如下(下面是个golang程序的配置文件).

{
    "paths": ["."],
    "depth": 2,
    "exclude": [],
    "include": ["\\.go$"],
    "command": [
        "bash", "-c", "go build && ./gogs web"
    ],
    "env": {
        "POWERED_BY": "github.com/codeskyblue/fswatch"
    }
}

paths只需要监控那些目录。一般.fswatch文件是和代码放在一起的,所以监控目录写.就可以了。
其中exclude是不想监控的文件, include是打算监控的文件. 如果include为空的话, 那就是所有文件都监控. 一般C,Cpp的配置写成

"include": ["\\.c$", "\\.cpp", "\\.h"]

这个样子就可以了.
python的可以把配置文件写成

"paths": ["."],
"include": ["\\.py$""],
"env": { 
    "PYTHONPATH": "$HOME/pylib"
},
"command": ["pyhon", "main.py"],

golang的可以写成

"paths": [
    "$GOPATH/src/github.com/dependicy1",
    "."
],
"include": ["\\.go$"],
"command": ["bash", "-c", "go build && ./app"]

java的(唉, 我java不熟, 就不写了吧)

其他语言的请各自发挥想象了, 项目地址的主页是 https://github.com/codeskyblue/fswatch

安装方法

go get github.com/codeskyblue/fswatch

运行起来还是挺不错的, 截个图贴在了下面

demo

mac上如果遇到提示说, 文件打开过多. 简单的修改下就好使了. 具体参考http://ronglei0324.blog.163.com/blog/static/676332232013122112049188/

需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。