今天解决第一个问题:服务器在异地,在Win上使用SI(SourceInsight)同步代码比较麻烦。
当前使用的方案:
将code复制到Win并创建SI工程。这意味着,在SI上对代码的任何修改,都需要手动copy到服务器替换指定路径下的文件。由于路径层次比较深,每次改动的文件又可能在不同的目录下,这将是一个比较耗时的麻烦事。
看到这里,大家脑海里应该会浮现出“使用samba映射服务器路径”的方法。实践发现,这个方案并不可行,因为这会导致SI上切换不同文件速度太慢。
解决方案:
由于程序员是一群了不起的实践者,我决定践行这个自己编造的谣言。我想用“在Win上搭建虚拟机”的方法解决这个问题。
Step1:Win上搭建虚机。
Step2:服务器发送代码到虚机。
Step3:samba映射虚机指定目录到Win,SI创建工程。
Step4:将SI上的代码改动同步到服务器。
Step1:略。
很简单,相信大家自己可以搞定。后面有机会再补充虚机的搭建。
Step2:服务器发送代码到虚机。请注意,所有命令都是在服务器执行的,不要登录虚机去执行,不利于脚本实现。
<1> 将代码备份,将备份代码中.c .h 文件保留,其他文件,全部删除。
# cp code_lsv/ code_tmp/ -rf
# find code_tmp/ -not -name "*.c" -not -name "*.h" -exec rm {} \; >/dev/null 2>&1
<2> 将清理后的备份代码打包压缩。
# tar czvf code.tar.gz code_tmp/
<3> 将压缩包发送到虚机。
# scp code.tar.gz binbin@ip:
<4> 将压缩包在虚机解压。
# ssh binbin@vbox_ip "tar xvfcode.tar.gz -C /code/path/"
<5> 将解压后的代码做初始化操作以方便后续代码同步:将每个.c .h 文件映射一个.c.last .h.last。
a. 将所有.c .h的文件名找出来放到一个文件中(.pcode.conf)
# find . -name '*.c' > ~/.pcode.conf
# find . -name '*.h' >> ~/.pcode.conf
b. 循环读取该文件,将该文件复制备份。(cp file.c file.c.last)
while read i
do
cp $i ${i}.last
cp $i ~/.pcodechange/
done < ~/.pcode.conf
这一步操作要解释下:想一下,如何同步代码呢?
方法一:同步时,将所有文件都发送回服务器,然后依次替换编译路径下的相应文件。文件有几十万,我怕把服务器累死啊!
方法二:同步时,将改动文件发送回服务器,然后依次替换编译路径下的相应文件。我想,这会仁慈很多。
那么,如何把SI上修改的文件找出来?
方法一:在把代码发送到虚机之后,在虚机上代码路径下的每个文件都备份一下。
同步时,就比较该文件和备份文件是否一致,如果是,说明文件没有被改动;
如果不一致,即该文件被改动过,需要同步到服务器。
同步完成后,将当前文件覆盖备份文件,以方便下次比较。
方法二:用stat可以看到文件的修改时间。所以,代码发送完毕之后,将每个文件的修改时间保存。同步时,判断修改时间是否改变,如果改变,需要同步到服务器。同步完成后,更新其修改时间。
方法三:用哈希判断。可以用md5给每个文件生成一个哈希值。同步时,判断文件的哈希是否改变,如果改变,需要同步到服务器。同步完成后,更新哈希。
我选择方法一,不要问为什么,我不想告诉你,是因为当时脑残。
所以,代码被发送到虚机后,我们对每个文件做备份文件以方便比对该文件是否被修改过。
代码的发送已经搞定。Step3:samba映射到Win,创建SI工程。
太简单,略过。
Step4:代码同步回服务器并替换指定文件。请注意,所有命令都是在服务器执行的,不要登录虚机去执行,不利于脚本实现。
<1> 将虚机上修改过的代码找出来。
# find . -name '*.c' > ~/.pcode.conf
#find . -name '*.h' >> ~/.pcode.conf
while read i
do
diff $i ${i}.last > /dev/null
if [ $? -ne 0 ]
then
cp $i ${i}.last
cp $i ~/.pcodechange/
fi
done < ~/.pcode.conf
<2> 发送到服务器。
#scp binbin@ip_vbox:.pcodechange/* .
<3> 将各个文件替换掉编译路径的相应文件。
for i in $(ls $file_dir)
do
file_name=`basename $i ${suffix}`
find . -iname "$file_name"
cp -f $i $filex
done
代码的同步已经搞定了。
现在,我们可以通过以下方法实现代码的同步:
psend /the/code/path#代码发送到虚机。
SI编辑代码。
/the/code/path # psync#修改的代码自动同步到服务器。
看下效果:
以上只是大概的思路。如果真的要做成一套工具,还有很多问题需要解决:
<1> 为了方便功能的扩展,如何设计整个框架?
<2> 如果代码分支有很多,如何避免用户将REL_164的代码同步到了REL_171的代码?
<3> 在scp的时候,默认是有交互的,如何跳过交互自动执行?
<4> 如何方便用户使用?如何能尽可能简单明了?
<5> 如何实现同步完成之后,revert回原来的版本?
<6> 如何能让用户更方便的记得你工具的名字?
<7> 随着功能越来越复杂,如何有效维护?如何有效调试?必要的打印一定要有。
<8> 如何实现多个功能的自由组合?
比如,同步代码是psync,编译代码是pmake,将镜像传递到路由器是cpimg,发送邮件是pmail,
如何设计才能实现一条龙?psync && pmake && cpimg && pmail;
需要尽可能减少交互 + 每个cmd实现单独功能。
<9> 如何处理各种异常?比如,scp时候权限不够退出了怎么办?查找的文件不存在怎么办?你如何第一时间找到出错原因?
代码实现可以在这里下载到,欢迎查阅:
https://git.oschina.net/powerbinbin/shell_esson_pwater