使用Ruby實現七牛同步盤(一)
然而這一切似乎都被一紙文件終結了,一如互聯網彩票的命運。不能買彩票的日子,寂寞如雪。縱觀當前還在提供服務的網盤,大多沒有辦法做到金山快盤那樣把目錄跟伺服器保持自動實時同步又甘願做一個默默無聞的幕後英雄。它們中要麼捆綁一個厚重的看似功能完備卻都是癢點需求的客戶端,彈窗,跳到瀏覽器等還要時不時出來找找存在感。要麼就是功能太弱智,連同步都做不到,整個一下載頁面的客戶端版,更遑論同步盤了。當然對於我,對於這個專欄系列來說它們都有一個重要而致命的問題——不支持Linux。
於是,作為被拋棄的孩子,我們堅決擁護並響應「自己動手,豐衣足食」的口號。
(註:圖文無關 O(∩_∩)O~ )
首先,註冊七牛個人開發者,可以擁有10G免費容量,足夠我們日常使用了。
接著我們來說說ruby。
我知道知乎是Python大本營,而Ruby在知乎群體不到py群體十分之一。但從個人情感角度講我更喜歡Ruby,待會我會列舉幾個例子來說明我為什麼更喜歡Ruby。當然我並不是想把Ruby和Python放到對立面。驕傲地說我自己也算半個Python高手了吧?Python一直以來被奉為運維神器(當然並不是說它只能用來做運維工具),是因為py既有shell這種所見即所得的腳本能力,又能跟操作系統本身結合緊密比如os模塊、fcntl模塊和sys模塊,同時面向對象,可以輕鬆構建出shellscript很難達到的軟體規模。Ruby相對於Python,對象化的更徹底,同時在別的語言中對象中對程序員隱藏的屬性和方法,Ruby全部對程序員開放了(感覺),這讓Ruby擁有了幾乎無敵的元編程能力。如果不涉及到跟別人合作,你可以按照自己的喜好編程,充分發揮自己的創意,這本來就是編程的魅力,不是嗎?:)如果你已經會了Python,那麼學習了Ruby將打開你的眼界,給你另一個看待問題的視角,這些又可以反過來作用你的Python技能,促使你寫出更好的代碼。
安裝Ruby推薦使用RVM工具,依賴管理使用bundle,安裝這些工具不是本文的重點。利用百度谷歌和一點點英文閱讀能力,可以很輕鬆的搞定。在此我選擇ruby2.4來作為這次行文記錄的版本。按理說ruby是跨平台的,本系列文章所做同步盤理論上可以奔跑在任何操作系統上面(包括mac,windows)。但是一如我專欄開頭所說,我的所有文章都是基於Archlinux+lxde的基礎上構建的,本人不為代碼正常工作在ubuntu,opensuse甚至mac,windows上負責!
按照慣例,先不急於寫代碼,而是規劃流程以及技術重難點。關於流程我的思路是這樣的,拿到七牛服務端的文件列表A比對本地目錄中的文件列表B,A中存在而B中不存在的文件我們需要下載,B中存在的文件而A中不存在的文件,我們需要上傳。還有一個問題就是刪除文件。如果我們主動刪除了文件,這樣按照我們之前規劃程序又會從伺服器下載一遍文件。所以我們需要一個目錄監聽的功能。增刪改本地目錄牽扯到上傳,比對牽扯到下載,於是重新規劃就很清晰了。
1. 比對A、B。 A中存在而B不存在的就下載
2. 監聽增刪改事件,用來觸發上傳
七牛方面的東西我們先放一放,因為有官方sdk以及文檔。所以在七牛方面我們應該不會遇到什麼問題。
打開terminal,輸入irb進入ruby shell。我們來體會一下ruby不輸python的系統管理模塊。
> require fileutils #導入fileutils模塊n=> truen> include FileUtils #載入FileUtils函數到Object對象上來n=> Objectn> cd /home/rowland/test n> pwdn=> /home/rowland/testn> touch ok.txtn=> [ok.txt]n> mv ok.txt,111.txtn=> 0n> rm 111.txtn
ruby的函數調用可以省略「()」,在參數單一,且沒有xx.x().x()這種連續調用的時候建議省略。
cd函數是屬於FileUtils的,省略類名調用cd默認調用Object.cd函數,由於剛剛我們已經把FileUtils的所有函數載入到了Object上面,所以Object也擁有了FileUtils的函數,這樣我們才能直接cd 『xxx』,是不是很神奇?
相信出於職業病,你會ls一下然後沮喪,並沒有ls列舉目錄的功能。是的,並沒有。但是仔細想一想,我們這個同步盤的列舉目錄和ls實現的列舉目錄還是不太一樣的,我們需要的是遞歸列舉所有子目錄。有沒有辦法呢?有的,標準庫模塊Find就具備這個功能。
> require findn=> truen> Find.find(/home/rowland/test).entriesn=> [".", n "./111.txt", n "./aaa", n "./ccd", n "./xx/dd/cc", n "./無標題文檔"]n
好了,列舉本地目錄功能和本地文件操作的重難點我們已經攻克。還剩一個重難點,監視目錄!這裡就需要安裝一個額外的第三方庫了——「listen」模塊。首先在代碼目錄下新建文件Gemfile內容如下
source "https://gems.ruby-china.org/"ngem listen, >=2.0n
第一行是申明下載源,因為一些眾所周知的原因,國內無法順利訪問到gem官方源,好在rubychina有鏡像源,下面一行申明listen庫和需要的版本。然後在terminal中使用
$> bundle installn
安裝依賴。安裝失敗注意查看日誌,有可能是許可權問題,也有可能是別的原因。總之日誌裡面應該會把錯誤語句顯示出來,你拿出來單獨執行應該就能看到詳細的報錯信息。
進入irb。
> require listenn> listener = Listen.to(/home/rowland/test) do |m, a, r|n p "modified :#{m}"n p "added: #{a}"n p "removed: #{r}"nendn> listener.startn
然後再去目錄裡面嘗試一下增刪改文件(文件夾不會被捕獲),然後應該可以看到輸出
irb(main):008:0> "modified :["/home/rowland/test/cc/無標題文檔"]"n"added: []"n"removed: []"n"modified :[]"n"added: []"n"removed: ["/home/rowland/test/cc/無標題文檔"]"n
OK,事已至此,重難點都被我們攻克了,這個同步盤搞出來就是時間問題了。等下一次更新吧。
是不是很強勢?聽聽歌吧
推薦閱讀:
※參加 RubyConf China 2017 是種怎樣的體驗?
※《面向對象設計實踐指南:Ruby語言描述》
※windows10下用gem安裝jekyll失敗,怎麼辦?(已解決)
※brew升級後ruby報錯怎麼辦?