7. 好的发行版制作实践

这些指南描述了当有人下载、检索和解压缩您的发行版时,它应该是什么样子。

7.1. 确保 tarball 始终解压缩到单个新目录中

新手开发者最常犯的错误是将 tarball 构建为将发行版中的文件和目录解压缩到当前目录中,这可能会覆盖已存在的文件。永远不要这样做!

相反,请确保您的存档文件都具有一个以项目命名的公共目录部分,以便它们将解压缩到当前目录下方的单个顶级目录中。

这是一个 makefile 技巧,假设您的发行版目录名为 `foobar`,并且 SRC 包含您的发行版文件列表,就可以实现这一点。SRC 也可以包含要完整包含的子目录名称。

foobar-$(VERS).tar.gz:
	@find $(SRC) -type f | sed s:^:foobar-$(VERS)/: >MANIFEST
	@(cd ..; ln -s foobar foobar-$(VERS))
	(cd ..; tar -czvf foobar/foobar-$(VERS).tar.gz `cat foobar/MANIFEST`)
	@(cd ..; rm foobar-$(VERS))

7.2. 拥有一个 README 文件

拥有一个名为READMEREAD.ME它是您源代码发行版的路线图。按照古老的惯例,这是勇敢的探索者在解压缩源代码后将读取的第一个文件。

README 文件中应该包含的好东西包括

  1. 项目的简要描述。

  2. 项目网站的链接(如果有的话)

  3. 关于开发者的构建环境和潜在的可移植性问题的说明。

  4. 描述重要文件和子目录的路线图。

  5. 构建/安装说明,或指向包含相同内容的文件的链接(通常是INSTALL).

  6. 维护者/贡献者列表,或指向包含相同内容的文件的链接(通常是CREDITS).

  7. 最近的项目新闻,或指向包含相同内容的文件的链接(通常是NEWS).

7.3. 尊重并遵循标准文件命名惯例

在查看 README 之前,勇敢的探索者将扫描解压缩后的发行版顶级目录中的文件名。这些名称本身可以传达信息。通过遵守某些标准命名惯例,您可以为探索者提供关于接下来要查找内容的有价值的线索。

以下是一些标准的顶级文件名及其含义。并非每个发行版都需要所有这些。

README 或 READ.ME

路线图文件,首先要阅读

INSTALL

配置、构建和安装说明

AUTHORS

项目贡献者列表。

一个较旧但仍然可接受的约定是将此文件命名为 CREDITS

NEWS

最近的项目新闻

HISTORY

项目历史

COPYING

项目许可条款(GNU 约定)

LICENSE

项目许可条款

MANIFEST

发行版中的文件列表

FAQ

项目的纯文本常见问题解答文档

TAGS

为 Emacs 或 vi 生成的标签文件

请注意,总体约定是,全大写名称的文件名是关于软件包的人类可读的元信息,而不是构建组件(TAGS 是第一个约定的例外,但不是第二个)。

拥有 FAQ 可以为您节省很多麻烦。当经常出现关于项目的问题时,请将其放入 FAQ 中;然后引导用户在发送问题或错误报告之前阅读 FAQ。一个维护良好的 FAQ 可以将项目维护者的支持负担减少一个数量级或更多。

拥有一个带有每次发布的时间戳的 HISTORY 或 NEWS 文件非常有价值。 除此之外,如果您遇到专利侵权诉讼,它可能有助于确定现有技术(这种情况尚未发生在任何人身上,但最好做好准备)。

7.4. 为可升级性设计

随着您发布新版本,您的软件会随着时间而变化。其中一些更改将不向后兼容。因此,您应该认真考虑设计您的安装布局,以便您的代码的多个已安装版本可以共存于同一系统上。 这对于库尤其重要——您不能指望您的所有客户端程序都与您的 API 更改同步升级。

Emacs、Python 和 Qt 项目在处理此问题上有一个很好的约定;版本编号的目录。以下是已安装的 Qt 库层次结构的外观(${ver} 是版本号)

/usr/lib/qt
/usr/lib/qt-${ver}
/usr/lib/qt-${ver}/bin          # Where you find moc
/usr/lib/qt-${ver}/lib          # Where you find .so
/usr/lib/qt-${ver}/include      # Where you find header files

通过这种组织方式,您可以拥有多个共存的版本。客户端程序必须指定他们想要的库版本,但这与接口不中断相比,只是很小的代价。

7.5. 提供校验和

为您的二进制文件(tarball、RPM 等)提供校验和。这将允许人们验证它们是否已损坏或被插入了木马程序代码。

虽然您可以使用多个命令来达到此目的(例如 sumcksum),但最好使用加密安全的哈希函数。 GPG 软件包通过以下方式提供此功能—detach-sign选项;GNU 命令 md5sum 也是如此。

对于您发布的每个二进制文件,您的项目网页应列出校验和以及您用于生成它的命令。