文档章节

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

go-skyblue
 go-skyblue
发布于 2014/01/19 21:17
字数 1218
阅读 4187
收藏 11

这个是做什么用的?

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

为什么需要fswatch

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

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

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

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

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

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

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

  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程序的配置文件).

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的文件,只需要写

- 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/

© 著作权归作者所有

go-skyblue

go-skyblue

粉丝 87
博文 50
码字总数 31881
作品 5
杭州
程序员
私信 提问
加载中

评论(7)

LongRaindy
LongRaindy
最近才看到这个,挺好用的,已star,谢谢go-skyblue。
吾爱
吾爱
赞,学习下
修改性别
修改性别
强烈支持!
go-skyblue
go-skyblue 博主

引用来自“double_dog”的评论

顶一个

thanks

d
double_dog
顶一个
go-skyblue
go-skyblue 博主

引用来自“yiqing95”的评论

0 赞一个

多谢支持

yiqing95
yiqing95
0 赞一个
基于 Redis 的应用配置文件热更新工具 - GRC

GRC - golang redis config GRC是一款使用golang redis 对应用程序的配置文件进行热更新的一款软件,方便在应用程序启动的过程当中实时更新我们的配置文件。 使用 可以参考测试文件 //使用N...

ppmoon
2018/07/14
372
2
OS X使用fswatch+rsync自动检测文件夹改动并同步

Linux下面可以使用http://linux.die.net/man/1/inotifywatch (inotify-tools包)来进行文件夹、文件变更的检测 fswatch是一个使用Mac OS X FSEvents API的同步工具,同时也可以使用在BSD 与...

程序员孟帅
2016/02/21
1K
1
用 air 给 Golang/Gin 框架提供热重启支持

Golang 这种编译语言和 Rails/Python 这种脚本语言不同, 脚本语言做后端, 只要不是配置和数据库有变化, 一般都是源代码一修改后, 最新后端服务就立即生效了. 但是 Golang 做后端, 需要每次修...

ManateeLazyCat
02/17
0
0
年终盘点!2017年超有价值的Golang文章

年终盘点!2017年超有价值的Golang文章 鸟窝2017-12-281 阅读 Go 马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍。 文章排名部分先后...

鸟窝
2017/12/28
0
0
文件事件触发工具--fswatch

fswatch 是一款查看文件变化的工具,会过滤无用的变化,文件发送变化时会触发 specfied 命令。它是款命令行工具,使用文件系统事件触发用户定义命令。 用法: Demo Video http://www.tudou....

叶秀兰
2014/01/20
906
0

没有更多内容

加载失败,请刷新页面

加载更多

spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
18分钟前
2
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
昨天
7
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部