用Golang擼了個文件監測、同步小工具

本文最先發佈於 Rootrl's Bloggit

緣起

咱們公司開發環境很特殊,一臺本地服務器,而後分配多個ssh帳戶給開發者。平時上傳代碼只能ftp/sftp鏈接上傳(之前用過samba共享,但被關了。。)。因此咱們平時是在Phpstorm上用sftp遠程打開服務器上的項目,而後設置自動上傳。這樣通常工做沒問題。可是有個坑:Phpstorm沒法捕獲相似git checkout這些更改文件的變化。。因此也就沒法讓本地代碼跟服務器保持一致了。因此也就誕生了想寫個這個同步機制的念頭,這種場景Golang很適合。因而就開始擼起來。。github

項目地址:https://github.com/rootrl/Mancygolang

實現

大體思路是監測一個文件夾的變化(本地代碼庫),若是有變化就經過sftp上傳到服務器上。json

監測文件變化用的是golang的fsnotify package,它提供的監測變化類型以下:api

const (
    FSN_CREATE = 1
    FSN_MODIFY = 2
    FSN_DELETE = 4
    FSN_RENAME = 8

    FSN_ALL = FSN_MODIFY | FSN_DELETE | FSN_RENAME | FSN_CREATE
)

可是fsnotify有個坑就是隻能監測一層文件夾的變化,多層文件夾須要本身遍歷掛載事件。後續新建文件夾,重命名這種也要手動加事件。服務器

其中每一個事件都對應一個處理通道,個人想法是讓文件處理者和事件解耦,由於後面不必定是sftp來處理上傳,也多是rsync,也可能其餘處理方式。因此後續處理者只用監聽對應事件通道,處理者這裏我用了golang的select實現了一個超時機制,有事件就處理,無事件有個幾秒的等待時間。ssh

fsnotify這塊代碼見: https://github.com/rootrl/Man...
sftp hanlder見: https://github.com/rootrl/Man...code

sftp用的是github.com/pkg/sftp這個庫,用起來仍是挺順手,但都是寫底層的api,因此我單獨封裝了個sftp_util: https://github.com/rootrl/Man... 有一些常見的上傳文件/文件夾,刪除文件/文件夾等操做orm

以上基本能實現主要功能了,而後我還定義了個配置文件結構,經過對應Json字符能夠把字段自動映射到這個結構上,供後續使用。這也是golang json包的方便之處。事件

總結

寫這個項目主要是用來練手golang的,剛開始階段,代碼可能寫得有點垃圾。。好比sftpClent客戶端這些目前是用全局變量實現的,能用,可是不夠優雅。。後續慢慢改進。。(可能永遠不會。。)

總之,Golang仍是挺不錯的!

相關文章
相關標籤/搜索