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

相關文章
相關標籤/搜索