代码打补丁的利器——diff和patch
一般来说,如果我们在研发过程中需要对代码进行修改,是不需要通过打补丁的方式的,因为我们可以直接改动文件即可。但是如果针对一款要上线的产品,我们总不能在研发的电脑上编译通过后直接发布到线上的。(转载请指明出于breaksoftware的csdn博客)因为这样做有很多缺陷:
- 最后负责编译的同事,可能忘记提交最终的代码。这样代码库中的代码逻辑和线上运行的产品逻辑将存在差异。
- 最后负责编译的同事的编译环境可能已经感染病毒,从而导致编译的产品也携带病毒。这样的产品发布到线上将污染生产环境。
- 无法保证最后负责编译的同事是否对产品逻辑“做过手脚”。
- 无法保证最后负责编译的系统版本和关联库版本和线上环境一致。
因为存在种种弊端,所以很多公司都会有专门的编译系统。大家把代码提交到代码库,然后触发编译平台。编译平台会挑选一些编译环境将代码从代码库中拉取下来,然后在这些与外网隔绝的稳定环境中进行代码编译。这样可以杜绝上述问题。
在一些成规模的公司,会有很多可供大家公用的代码库。如果我们要实现一个功能,可能会用到这些代码库——即依赖,其与我们工程的关系可以分为以下两种:
- 把这些依赖放在我们工程代码内部,成为我们自己的私有代码。
- 依赖以独立模块存在,不属于我们自己维护的工程代码。只有在编译前才拉取下来。
可以看出方案1非常不易于维护,因为我们的依赖库会不定期更新,这样就需要定期检查每个依赖库是否有更新并同步更新。而方案2可以让我们从上述繁琐的工作中解脱出来。我们只要在编译前把库(可能是最新的)拉取到本地或者编译环境下即可,而不用关心库的维护者什么时候进行了更新。因此。一般项目我们都是选用方案2的。
上述看着一切都很美好。而然现实往往比理想要复杂很多。比如我们发现依赖库存在bug,而维护者没有时间去验证bug从而无法提供一个我们认为“稳定”的版本。我们又无法登陆公司的编译环境(实际上公司也不会让普通员工登陆编译环境,否则就太危险了),不可以手工修改依赖库的代码。这种条条规则框住的“无解”问题怎么办?给代码打patch此时就有了用武之地了。
给代码打patch需要用到两个工具——diff和patch,它们都是linux系统上工具,我们可以很放心的使用。
diff工具是用于生成补丁文件的。比如依赖库文件中文件A.cpp有bug,我们修改了bug并将文件另存为A_modify.cpp,这样通过下面命令生成补丁文件A_patch.cpp
diff -up A.cpp A_modify.cpp > A_patch.cpp
在编译前,调用下面指令将补丁临时放到依赖库的A.cpp中
patch -p0 < A_patch.cpp
这个时候A.cpp代码就已经没有bug了,我们执行编译。等编译结束后,我们可以使用下面指令,还原A.cpp到原始的内容,即去除补丁
patch -RE -p0 < A_patch.cpp
举个例子:src目录下有不能修改的代码,而我们需要修改其中若干个文件。则我们将创建一个叫做modiy_src的目录,其中文件和src中文件相对路径一致。这样我们就可以修改modify_src下的代码,然后使用cmp工具对比每个文件。如果发现modify_src中的文件和src中的文件不一致,则在patch_src目录下生成一个相对路径一致的补丁文件
#!/bin/shfunction left_to_right(){for element in `ls $1`doleft_dir_or_file=$1"/"$elementright_dir_or_file=$2"/"$elementpatch_dir_or_file=$3"/"$elementif [ -d $left_dir_or_file ];thenleft_to_right $left_dir_or_file $right_dir_or_file $patch_dir_or_fileelseextension=${left_dir_or_file##*.}if [ "$extension" != "c" -a "$extension" != "h" ];thencontinuefiif [ ! -f "$right_dir_or_file" ];thenright_path_floder=$(dirname $right_dir_or_file)if [ ! -d "$right_path_floder" ];thenmkdir -p $right_path_floderficp $left_dir_or_file $right_dir_or_fileelsecmp -s $left_dir_or_file $right_dir_or_filedifferent=$?if [ 0 == $different ];thencontinuefipatch_path_floder=$(dirname $patch_dir_or_file)if [ ! -d "$patch_path_floder" ];thenmkdir -p $patch_path_floderfidiff -up $left_dir_or_file $right_dir_or_file > $patch_dir_or_filefifidone
}left_to_right src/ modify_src/ patch_src/
然后再写一个脚本,对patch_src下文件进行遍历,并且根据传入的参数决定“打补丁”还是“去除补丁”。
#!/bin/shfunction patch_files(){if [ "$2" == "recover" ];thencover=0elif [ "$2" == "cover" ];thencover=1elseecho "sh patch_files cover/recover"exitfifor element in `ls $1`dopatch_dir_or_file=$1"/"$elementif [ -d $patch_dir_or_file ];thenpatch_files $patch_dir_or_file $2elseif [ 0 == $cover ];thenpatch -RE -p0 < $patch_dir_or_fileelsepatch -p0 < $patch_dir_or_filefifidone
}patch_files patch_src/ $1
这样在编译时我们这么做,以保证编译正确的代码,同时在编译结束后将代码还原
sh ./patch_files.sh cover
make
sh ./patch_files.sh recover
相关文章:

React Namespaced Components
2019独角兽企业重金招聘Python工程师标准>>> var MyForm React.createClass({...}); var MyForm.Row React.createClass({...}); var MyForm.Label React.createClass({...}); var MyForm.Input React.createClass({...}); This feature is available in v0.11 …
Linux下HOOK动态链接库中API的方法
2012年,我写了一篇介绍Windows系统下Ring3层API的hook方案——《一种注册表沙箱的思路、实现——Hook Nt函数》,其在底层使用了微软的Detours库。5年后,我又遇到这么一个问题,但是系统变成了Linux。我最开始的想法是找一个Linux下…

NAT的配置与相关概念的理解
试验背景:随着接入因特网的计算机数量不断猛增,IPv4版本地址资源也就愈加显得捉襟见肘。好多企业申请的IP地址都是经过子网不断划分得到的。A类,B类地址基本已用完,而一般的用户根本就申请不到整段的公网C类地址。如果,…
AAAI 2020论文解读:商汤科技发布新视频语义分割和光流联合学习算法
来源 | Every Frame Counts: Joint Learning of Video Segmentation and Optical Flow编辑 | Carol出品 | AI科技大本营(ID:rgznai100) 商汤科技研究团队发表论文《Every Frame Counts: Joint Learning of VideoSegmentation and Optical Flo…

互联网+和创业潮,互联网+前提条件是什么?互联网+做什么?
在大众创业,万众创新的大浪下,凭着对新技术的敏感和青春激情,创业新军不断涌现.... 互联网创业浪潮, 如雨后春笋......,互联网渗透每个人的心中。创业不是赶时髦,而是一条非常孤独,艰难的路。实施“互联网+…

C++拾趣——C++11的语法糖auto
C是一种强类型的语言,比如变量a,如果声明它是整型,则之后只能将它作为整型来用。这和其他弱类型的语言有很大的区别,比如python中,我们可以让a在第一行是个整型,第三行是一个字符串。(转载请指明…
“数学不行,啥都干不好!”骨灰级程序员:这比努力重要1000倍
之前有很多程序员读者向我们抱怨:1)做算法优化时,只能现搬书里的算法,遇到不一样的问题,就不会了。2)面试一旦涉及到算法和数据结构,如果数学不行,面试基本就凉凉了。3)一…

跳槽 你准备好了吗
“人往高处走”,这固然没有错。但是,说来轻巧的一句话,它却包含了为什么“走”、什么是“高”、怎么“走”、什么时候“走”,以及“走”了以后怎么办等一系列问题。跳槽是一门学问,也是一种策略。“人往高处走”&#…

C++:常类型Const
常类型:使用类型修饰符const说明的类型,常类型的变量或对象成员的值在程序运行期间是不可改变的。 3.10.1 常引用 如果在说明引用时用const修饰,则被说明的引用为常引用。如果用常引用做形参,便不会产生对实参 的不希望的更改。常…

JQuery制作的toolTip,针对图片预览效果
昨天做了一个文字版的toolTip,后来想想现在大家都爱看图,文字未免有点单调了点,那我们就来个图片式的预览。代码比较简单,我就不多说了。 欢迎来到 买礼网 选购礼品! 畅游鄂西山水风光尽在 恩施旅游资讯网首先看看调用…
29篇计算机视觉领域论文,篇篇惊艳!内附链接!
作者 | 微软亚洲研究院本文经授权转载自微软研究院AI头条(ID:MSRAsia)1. Deep High-Resolution Representation Learning for Human Pose Estimation论文链接:https://arxiv.org/pdf/1902.09212.pdf该论文在提出了一个新的网络Hig…
绑定CPU逻辑核心的利器——taskset
在工作中,我们可能遇到这样的需求:如何评估程序在一核和多核下的工作效率差距?最简单的想法是找一台只有一个CPU逻辑核的机器和一台有多个逻辑核的机器。(转载请指明出于breaksoftware的csdn博客)但是这种方式有明显的…

IDE set arguments
2019独角兽企业重金招聘Python工程师标准>>> code::blocks -> Project -->set programs arguments qtcreater -> Projects --> Build&Run --> Run --> Arguments xcode -> super < -->build-->arguments 转载于:https://my.osch…
2020年AI如何走?Jeff Dean和其他四位“大神”已做预测!
作者 | Khari Johnson译者 | 王艳妮 责编 | 胡巍巍出品 | AI科技大本营(ID:rgznai100)人工智能已经不再是随时准备改变世界的状态,而是已经在改变世界。在迈入2020年这新的一年、以及新的20年代之际,笔者请到了AI方面最…
zookeeper快速入门——简介
在几十年前,一个独立的计算机上往往部署着一套完整的应用系统。当时因为网络稳定性及速度的限制,将相关联的服务部署在一台机器上,让它们使用系统机制通信——比如管道,文件等,往往是最稳定和最高效的。然而随着网络技…

为TextMate扩展全屏功能
今天看代码,感觉TextMate那个窗口太小了点,越看越不爽,就想把它弄成全屏的。于是搜索啊搜索啊搜索,终于让我找到一款很yd的小软件,叫megazoomer, 下载地址是:[url]http://ianhenderson.org/mega…

hdu1406
一道很水很水的题!!!!!!!!!!#include<iostream> using namespace std; int main(){int num1,num2,i,k,j,sum,n;while(cin>>n){ while(n--){cin&g…
zookeeper快速入门——部署
zookeeper有两种运行模式:独立模式和仲裁模式。独立模式就是只运行一个Zookeeper Server,这自然没法解决服务崩溃导致系统不可用的问题。仲裁模式就是以集群的方式运行Zookeeper Server,这样在Leader不可用时,集群内部会发起选举&…
2020,人工智能和深度学习未来的五大趋势
来源 | forbes编译 | Shawn编辑 | Carol出品 | AI科技大本营(ID:rgznai100)虽然近年来人工智能经常成为热门议题,但它还远未实现真正的成就。人工智能技术发展的主要障碍在于投资成本,投资成本影响短期内的回报。而当时…

电脑常见故障 1
死机恐怕是所有电脑故障里面最常见的一种了,但是死机的原因是多种多样的。 如果从硬件入手,先是看看机箱里的温度是否很高,要检查CPU的风扇是否正常运转,并要注意电脑的散热问题;其次可检查内存,检查完内存…

linux常用命令-date-clock-hwclock-type-whois--help-man-info-cal
date:时间管理电子表:晶体震荡器 石英震荡器Linux:rtc 硬件时间NTP:网络时间协义硬件时间(命令:clock)系统时间(命令:date)type COMMAND 判断命令是内部命令…
内存、性能问题分析的利器——valgraind
valgrind是一个知名的分析软件集。我们可以使用它进行内存、多线程及性能等各种问题的分析。它采用非侵入方式,所谓非侵入方式是指:我们不用在代码中插入分析工具的库。这对于开发者来说是友好的。因为如果要将工具编译到文件中,或者要调用其…
这是我见过最卡通的 Python 算法了,通俗易懂
普通程序员,不学算法,也可以成为大神吗?对不起,这个,绝对不可以。可是算法好难啊~~看两页书就想睡觉……所以就不学了吗?就一直当普通程序员吗?如果有一本算法书,看着很轻松……又有…

WebService(Axis2)视频教程与QQ交流群发布
Axis2是目前比较流行的WebService引擎。WebService被应用在很多不同的场景。例如,可以使用WebService来发布服务端 Java类的方法,以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。WebService还经常被使用在SOA中&#x…

fragment类onresume里面刷新操作处理
今天项目中涉及fragment中嵌套多个fragment,但是要根据tag去展示对应的fragment,而不是默认展示的第一个fragment,如果使用activity很容易想到onpause(),onResume()中进行处理,但是你会发现fragment的onpause和onresume只调用一次…
内存问题分析的利器——valgrind的memcheck
在《内存、性能问题分析的利器——valgrind》一文中我们简单介绍了下valgrind工具集,本文将使用memcheck工具分析各种内存问题。(转载请指明出于breaksoftware的csdn博客) 本文所有的代码都是使用g -O0 -g mem_error.c -o mem_erro编译&#…

类项目中的配置文件app.config在打包安装后的信息获取的问题
在一个项目中碰到这样的一个问题,做一个WORD插件,功能在类库项目中实现了,配置信息存在类库项目的配置文件app.config中,在进行打包后,获取的配置文件中的DocType节点信息时,使用以下方法 ConfigurationMa…
AAAI 2020论文解读:商汤科技提出新弱监督目标检测框架
来源 | Object Instance Mining for WeaklySupervised Object Detection编辑 | Carol出品 | AI科技大本营(ID:rgznai100)商汤科技视频大数据团队发表论文《Object Instance Mining forWeakly Supervised Object Detection》,该论文…

20135306黄韧 信息安全系统设计基础期中学习总结
信息安全系统设计基础第八周学习总结 知识点总结 第1章 计算机系统漫游 △计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位.它们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式&…

使用SQL Server维护计划实现数据库定时自动备份
在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库。而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员每天守到晚上1点去备份数据库。要实现数据库的定时自动备份,最常用的方式就是使用SQL S…