9.5 发行软件
发行软件面临的最主要问题是,如何确保已包含所有必要的文件并且它们都属于正确的版本。幸运的是,因特网编程社区已形成了一套健壮的方法,非常有助于解决这些问题,这些方法包括以下几个。
❑ 利用所有UNIX系统都有的标准工具将软件所需的所有文件打包为一个单独的软件包文件。
❑ 控制软件包的版本编号。
❑ 建立文件命名规范,在软件包文件的名字中包含版本号,从而方便用户辨认他们所使用的软件的版本。
❑ 在软件包中使用子目录,以确保从软件包中提取的文件都被放置到单独的目录中,这样哪些文件属于软件包,哪些不是就一目了然了。
这些方法的产生意味着软件的发行工作能够轻松、可靠地完成。但软件的安装是否容易则是另外一回事,因为这与软件本身以及准备安装它的计算机系统有关。但至少你可以确保软件包中的所有文件都是正确的。
9.5.1 patch程序
软件发行以后,用户发现软件的漏洞或开发者希望增强或升级软件的情况几乎是不可避免的。如果开发者以二进制文件的形式发行软件,他们通常只会发行新的二进制文件。有时(经常是这样),厂商只是发布程序的一个新版本,而对具体的修订情况以及所做的改动则一笔带过。
另一方面,以源代码的形式来发行软件是个好主意,因为它允许用户了解你是如何实现该软件以及如何运用一些功能的。它还可以让用户检查程序在做什么,并且允许用户重用软件的部分源代码(前提是他们遵守相关的许可证协议)。
但是,对于Linux内核的源代码来说,它在压缩之后仍然有数十兆之多,包装并传送一套新版本的内核源代码将消耗大量的资源,而事实上,各版本之间可能只有很少一部分的源代码发生了改动。
幸运的是,我们有一个解决这一问题的工具程序——patch,它由Larry Wall编写,他也是Perl编程语言的开发者。patch命令允许软件的开发者只发行定义两个版本之间区别的文件,这样无论是谁,只要他拥有某个文件的第一个版本和第一个版本与第二个版本之间的区别文件,他就可以用patch命令来自己生成该文件的第二个版本。
如果你有一个如下文件的第一个版本:
它的第二个版本如下所示:
你可以使用diff命令列出两个版本之间的不同之处:
diffs文件的内容如下所示:
这实际上是一组编辑器命令,它们用于将一个文件修改为另一个文件。假设你已经有了文件file1.c和diffs,就可以用patch命令来更新文件file1.c,如下所示:
patch命令将文件file1.c修改为与file2.c一模一样。
patch命令还有另一个技巧:取消补丁的能力。假设你不喜欢刚才的修改,想将file1.c恢复为原来的样子。没问题,你只需再次使用patch命令,不过这一次要使用-R(反向补丁)选项:
文件file1.c将回到它最初的样子。
patch命令还有其他几个选项,但一般情况下它会根据输入的内容来判断用户想做什么,然后执行正确的操作。如果patch命令执行失败,它会创建一个后缀名为.rej的文件,在该文件中将包含无法打上补丁的文件内容。
在处理软件的补丁时,使用diff命令的-c选项是个好办法。这个选项的作用是产生一个基于上下文的diff,即提供每处修改的前后几行内容,这样patch命令可以在打补丁之前验证上下文是否匹配,而补丁文件本身也更容易阅读。
如果你在某个程序中发现了漏洞并进行了修补,给程序的开发者发送一个补丁比仅仅给出对修补的描述要更容易、更准确,也更有礼貌。
9.5.2 其他软件发行工具
Linux的程序和源代码通常以打包压缩文件的格式发行,在文件名中包含软件的版本号,文件的后缀名为.tar.gz或.tgz,这类文件通常也被称为tarballs文件。如果使用的是普通的tar命令,则创建tarballs文件必须经过两个步骤。下面的命令将为应用程序创建一个打包压缩文件:
你现在有了一个TAR文件,如下所示:
你可以用压缩程序gzip对该文件进行压缩,使得其容量更小:
正如你所看到的,最终的文件容量被压缩的非常小。你还可以把文件的后缀名.tar.gz改为更简单的.tgz,如下所示:
这种以一个小数点和3个字符结尾的文件命名方式看上去像是针对Windows系统的一种妥协,因为Windows系统不同于Linux和UNIX系统,它对文件后缀名正确与否的依赖性非常强。要想再取回文件,你需要先解压缩tar文件,再解包,从而将文件释放出来,如下所示:
如果使用的是GNU版本的tar命令,情况将变得更简单,你仅用一步就可以创建打包压缩文件,如下所示:
同样,解压缩操作也很简单,如下所示:
如果想在没有真正解压缩文件的情况下了解打包压缩文件的内容,你可以使用tar命令的另一个选项ztvf。
我们在上面的例子中使用了tar命令,但对其选项的描述仅限于例子中使用的那些选项。下面我们将对该命令及其常用选项做简单的说明。正如你在上面的例子中所见,tar命令的基本语法是:
列表中的第一项是目标,虽然我们一直处理的都是文件,但它也可以是一个设备。列表中的其他项将根据选项的情况被添加到新档案文件或已有档案文件中。列表中还可以包含目录,默认情况下,该目录中的所有子目录都将被包含到档案文件中。释放文件并不需要给出文件的名字,因为tar命令将保留文件的完整路径。
在本节中,我们使用了tar命令的如下6个选项的组合。
❑ c:创建新档案文件。
❑ f:指定目标为一个文件而不是一个设备。
❑ t:列出档案文件的内容,但并不真正释放它们。
❑ v(verbose):显示tar命令执行的详细过程。
❑ x:从档案文件中释放文件。
❑ z:在GNU版本的tar命令中用gzip命令压缩档案文件。
tar命令还有许多其他选项,我们可以用这些选项来更好地控制tar命令的操作过程及其要创建的档案文件。详细资料请参考tar命令的手册页。