自制工具:上傳修改過的文件到指定服務器


需求  

一直希望有一個工具,能夠自動監測修改了代碼庫的哪些文件,然后替換遠端代碼庫的相同文件。有這個需求的原因主要是經常需要在服務器上跑代碼,但是因為開發環境和網絡環境的關系,線上寫代碼並不是很方便,所以我經常在本地環境寫代碼然后scp 文件去遠端。 為什么不用git?因為我不想每改幾行代碼就commit 一次,這樣會產生很多垃圾提交,況且要走完add->commit->push->pull->(conflict?)也是個很蛋疼的流程。

  但是scp 還是太麻煩了,因為如果一次改動多個文件,我還要git status 一下看看改了哪幾個,然后一個一個敲命令上傳。而且如果測試時發現問題,找半天才發現是因為傳漏了一個文件。。。所以我決定磨刀不誤砍柴功,琢磨一下能不能把流程自動化。

方案

  首先要解決監測文件修改的問題,於是我開始着手寫一個監測文件修改的程序!並沒有,git 里的diff 工具就干這事啊。於是在我翻查git --help diff 的時候發現了diff 的一個參數 --name-only。 加上這個參數以后diff 就會打出自上次commit 以來被修改過的文件名,正和我意。接下來我只要寫一個腳本,把diff 的輸出pipe 進去然后自動執行scp 豈不美哉?

  寫一個上傳文件到指定服務器的指定目錄的腳本,發現我bash 非常拙計,怎么處理字符串,怎么循環都不會。。。好吧,我還是實施曲線救國道路,用我熟悉的nodejs。

var readline = require('readline')
    , exec = require('child_process').exec

var remote = "username@my.remote.com:~/project/"

var rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
        terminal: false
})

rl.on('line', function(line) {
    exec('scp ' + line + ' ' + remote + line, function(error, stdout, stderr) {
        if (error) {
            console.error(error);
            return;
        }
        console.log(line);
    })
})

利用自帶的readline 和 child_process核心模塊加之小心翼翼地填寫了服務器目錄,命令樣式以后,簡單的上傳程序完成了。

此程序從標准輸入逐行獲取字符串,然后憑湊出我想執行的scp 命令樣式然后執行,就是這么簡單,這個程序我叫他 updiff.js

 

組裝

  核心完成了,接下來我想用一個簡單的腳本將它們捆綁在一起

git diff --name-only | node /path/to/util/updiff.js

簡單的pipe 連在一起搞定,保存成文件 updiff.sh

接下來,我把這個sh 文件放在一個我專門存放小工具的目錄下,並把該目錄添加到$PATH 里。這樣我就可以在中斷里隨意使用我的自制工具了。

 

總結

  現在每當我要在本地寫代碼線上調代碼的時候再也不用擔心:1.文件太多打命令太煩了。2.傳錯傳漏。

  然而並不完美,1.首先能夠直接scp 上去的原因是因為我早在服務上添加了我的公鑰,如果沒有公鑰則需要密碼,那怎么辦呢?2.updiff.js 里hardcode 了上傳服務器及路徑,也就是說此腳本並不通用,因為我99%的時間工作在同一代碼庫下,所以這只是我的單一需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM