自制工具:上传修改过的文件到指定服务器

需求  

一直希望有一个工具,能够自动监测修改了代码库的哪些文件,然后替换远端代码库的相同文件。有这个需求的原因主要是经常需要在服务器上跑代码,但是因为开发环境和网络环境的关系,线上写代码并不是很方便,所以我经常在本地环境写代码然后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%的时间工作在同一代码库下,所以这只是我的单一需求。

posted @ 2015-09-25 18:22  Agentgamer  阅读(1390)  评论(5编辑  收藏  举报