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

这个是作什么用的?

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

为何须要fswatch

写完代码最重要的事情之一, 就是检测一下写好的代码是否是可以工做. 要早提早作的话, 收效越好, 发现的问题越多. 可是若是每次都须要make test, 每次都去编译或者测试的话, 仍是挺烦人的. 因此若是能有一个自动化的工具去作的话, 那将是件很爽的事情.python

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

事情在某一天终于有了起色, 周末我研究了下sublime text2. 我过去只是据说它但没有真正的用过. sublime text2 有不少的配置文件(json格式的), 你只须要配置好, 就能够万事大吉了. 把配置拷贝到其余电脑上, 也能很好的work. 看来配置文件真是个好东西啊.git

曾有人fork了个人那个fswatch工具, 把fswatch改为一个配置文件的方式, 可是改的很简单, 当时我没有在乎. 但如今看来,配置文件的方式真的很nice, 你只须要在项目下创建一个.fsw.yml的配置文件, 进行一次参数的调整. 之后只须要运行fswatch就能够了. 多么简单的一个道理,理解起来去花了这么久.github

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

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

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

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

上手使用

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

desc: Auto generated by fswatch [fswatch]
triggers:
- pattens:
  - '**/*.go'
  # also support '!**/test_*.go'
  env:
    DEBUG: "1"
  # if shell is true, $cmd will be wrapped with `bash -c`
  shell: true
  cmd: go test -v
  delay: 100ms
  signal: "KILL"
watch_paths:
- .
watch_depth: 5

watch_paths只须要监控那些目录。通常.fsw.yml文件是和代码放在一块儿的,因此监控目录写.就能够了。 其中pattens是想监控的文件, 若是须要监控go,可是须要过滤掉test_*.go的文件,只须要写bash

- pattens:
  - '**/*.go'
  - '!**/test_*.go'

这个样子就能够了.

配置也能够简单一些,python的能够把配置文件写成

desc: Auto generated by fswatch [fswatch]
triggers:
- pattens:
  - '**/*.py'
  cmd: python main.py
  signal: "KILL"

golang的能够写成

desc: Auto generated by fswatch [fswatch]
triggers:
- pattens:
  - '**/*.py'
  shell: true
  cmd: go build && ./app
  signal: "KILL"

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

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

安装方法

go get -u -v github.com/codeskyblue/fswatch

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

demo

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

相关文章
相关标签/搜索