软件发布实践HOWTO

埃里克·斯蒂芬·雷蒙

修订历史记录
版本4.12013-01-14修订人:esr
从回购中查看,以确保针对新代码进行修补。新生改名了。USENET主题组不太可见再。
版本4.02010-04-11修订人:esr
不再需要在项目中提供RPMS或deb级别。包装基础设施在这方面做得很好。关于配置和自动工具的新警告。AsciiDOC公司现在是文档管理员的可行替代方案。
版本3.92004-11-28修订人:esr
新材料的良好修补实践。推荐电动围栏和valgrind,而不是专有工具。
版本3.82003-02-17修订人:esr
网站移动后的URL修正。
版本3.72002-09-25修订人:esr
指向DocBook解密HOWTO。
版本3.62002年9月-12日修订人:esr
Keith Bostic关于便携性的合并材料。
版本3.62002-08-14修订人:esr
重写了关于文档实践的部分,因为XML-Docbook现在成熟了。
3.5版2002-07-04修订人:esr
增加了关于提供校验和的部分。引用doclifter。
版本3.42002-01-04修订人:esr
更多关于良好修补实践的信息。
第3.3版2001-08-16修订人:esr
关于如何发送好补丁的新部分。
版本3.22001-07-11修订人:esr
注意不要依赖专有组件。
版本3.12001-02-22修订人:esr
LDP Styleguide修复。
版本3.02000-08-12修订人:esr
第一个DocBook版本。关于SourceForge的建议和主要部分增加了文档实践。

本HOWTO描述了Linux和其他开源项目。通过遵循这些实践,您将做到让用户尽可能容易地构建和使用您的代码其他开发人员了解您的代码并与您合作改进它。

本文档是新手开发人员必须阅读的。有 经验开发人员应该在即将发布新的项目。它将定期修订,以反映良好实践标准。


目录
1介绍
1.1.为什么选择此文档?
1.2.本文档的新版本
2良好的修补做法
2.1.发送补丁,不发送整个档案或文件
2.2.针对当前版本的代码发送修补程序。
2.3.不要为生成的文件包含修补程序。
2.4.不要发送只调整版本控制$-符号的补丁带。
2.5。请使用-c或-u格式,不要使用默认(-e)格式
2.6.务必在修补程序中包含文档
2.7.务必在补丁中包含说明
2.8.在代码中包含有用的注释
2.9.每个补丁只有一个错误修复或新功能。
三。良好的项目和档案命名实践
3.1.将GNU样式的名称与词干和major.minor.patch编号一起使用。
3.2.但在适当的情况下尊重当地惯例
3.3.尽量选择唯一且易于键入的名称前缀
4良好的许可和版权实践:理论
4.1.开源和版权
4.2.什么是开源
5良好的许可和版权实践:实践
5.1.让自己或FSF成为版权所有者
5.2.使用符合开源定义的许可证
5.3。如果可以避免的话,不要编写自己的许可证。
5.4.使您的许可证在标准位置可见。
6良好的开发实践
6.1.选择最容易移植的语言
6.2.不要依赖专有代码
6.3.构建系统
6.4.在发布之前测试代码
6.5.发布前检查代码是否正确
6.6.健全性-在发布之前检查您的文档和README
6.7.推荐的C/C++可移植性实践
7良好的分销实践
7.1.确保tarball总是解压缩到一个新目录中
7.2.进行自述
7.3。尊重并遵循标准文件命名实践
7.4.可升级性设计
7.5.提供校验和
8良好的文件编制规范
8.1.文档格式
8.2.良好做法建议
9良好的沟通实践
9.1.向Freecode发布
9.2.有一个网站
9.3.主机项目邮件列表
9.4条。向主要档案馆发布
10良好的项目管理实践

1.简介

1.1. 为什么选择此文档?

有大量良好的实践传统帮助他人移植、使用和合作的开源代码开发它。其中一些约定在Unix中是传统的世界和Linux之前;另一些是最近针对特定的新工具和技术,如万维网网状物。

本文档将帮助您学习良好实践。它是有组织的分为主题部分,每个部分包含一系列清单项。想想这些是您的补丁或软件的飞行前检查清单分布。

翻译成德国的可用。


1.2. 本文档的新版本

此文档将每月发布到新闻组comp.os.linux.answers公司.你也可以在万维网上查看此HOWTO的最新版本通过URLhttp://tldp.org/HOWTO/Software-Release-Praction.html.

请随时将有关本HOWTO的任何问题或意见发送至埃里克·雷蒙德,.


2.良好的修补实践

大多数人通过编写补丁参与开源软件在发布自己的项目之前,先发布其他人的软件。假设您已经为其他人的源代码编写了一组更改基线代码。现在站在那个人的立场上。他怎么样了判断是否包含补丁?

事实上,很难判断代码的质量。因此,开发人员倾向于通过提交的质量来评估补丁。他们在提交者的风格和沟通行为中寻找线索相反,表明此人处于自己的地位了解必须评估和合并传入补丁的感觉。

这实际上是一个相当可靠的代码质量代理。在许多国家多年来,我一直与数百名陌生人打交道很少看到一块贴片是经过深思熟虑的,并且尊重我的时间,但技术上是假的。另一方面,经验告诉我看起来粗心大意或以懒散和不体贴的方式包装的补丁实际上很可能伪造的。

以下是关于如何接受修补程序的一些提示:


2.1. 发送修补程序,不发送整个存档或文件

如果您的更改包含代码中不存在的新文件,当然,您必须发送整个文件。但如果你在修改一个已经存在的文件,不要发送整个文件。改为发送差异;具体来说,发送差异(1)命令运行以将基线分布式版本与您的修改版本。

diff命令及其双重命令,补丁(1)(自动将差异应用于基线文件)是开源开发最基本的工具。差异更好而不是整个文件,因为您要向5月份的开发人员发送补丁收到副本后,已更改了基线版本。通过发送他与你不同,你为他节省了将你的更改与他的更改分离的努力;你尊重他的时间。


2.2. 针对当前版本的代码发送修补程序。

派遣维护人员既适得其反又粗鲁无礼针对之前几个版本中存在的代码进行补丁他要做所有的工作来确定哪些改变了重复的事物从那以后,与你的补丁中哪些东西实际上是新颖的相比。

作为补丁提交者,它是你的责任跟踪源的状态并向维护者发送一个最小的补丁它表示您希望对主线代码库执行的操作。这意味着针对当前版本发送修补程序。

如今,所有开源项目都有效地生成了源代码可通过公共匿名访问项目的版本控制收回权。确保您正在修补当前是从项目的存储库。所有版本控制系统都有一个命令,允许您区分你的工作副本和头部;使用它。


2.3。不要为生成的文件包含修补程序。

在发送修补程序之前,请仔细检查并删除任何其中要自动重新生成的文件的修补带一旦他应用补丁并重新制作。这方面的经典例子错误是C文件由野牛弯曲.

这些天来,这种最常见的错误是发送一个diff用一个巨大的乐队,在你的配置脚本和他的。此文件由生成自动配置文件.

这是不体谅人的。这意味着你的收件人遇到了麻烦将补丁的真实内容从大量庞大的噪声中分离出来。这是一个小错误,不如我们将得到的一些东西重要继续下去,但这对你不利。

如果您已经签出,您可能会自动避免这种情况来自项目报告的代码并使用版本控制系统的差异命令生成修补程序。


2.4. 不要发送只调整版本控制$-符号的补丁带。

有些人在源文件中放置特殊标记签入文件时由版本控制系统展开:美元Id$RCS、CVS和例如,颠覆。

如果您自己使用本地版本控制系统可以更改这些标记。这并不是真的有害,因为当你收件人在应用了他们将获得的修补程序后重新签入他的代码基于重新扩展他的版本控制状态。但是那些额外的贴片带是噪音。他们在分散注意力。还有更多考虑不发送它们。

这是另一个小错误。如果你这样做,你会被原谅的把大事做好。但你无论如何都要避免。


2.5. 请使用-c或-u格式,不要使用默认(-e)格式

的默认(-e)格式差异(1)非常脆弱。它不包含任何上下文,因此补丁工具无法处理基线中是否插入或删除了任何行代码,因为您获取了修改后的副本。

获得-e diff很烦人,这表明发送者要么是一个极端的新手,要么粗心大意,要么一无所知。大多数此类补丁毫不犹豫地被淘汰出局。


2.6。务必在修补程序中包含文档

这非常重要。如果您的补丁使用户可见添加或更改软件功能,包括对修补程序中适当的手册页和其他文档文件.假设收件人愿意为您记录代码,否则将隐藏未记录的功能在代码中。

很好地记录您的更改可以展示一些好的东西。第一,这对你想说服的人来说很体贴。第二,它表明你很好地理解了变化的后果向看不到代码的人解释。第三,它证明了你关心最终使用软件的人。

良好的文档通常是区分一次快速而肮脏的黑客活动做出了坚实的贡献。如果你慢慢来并且小心生产,你会发现你已经是让补丁被大多数开发人员接受的方法。


2.7. 务必在补丁中包含说明

你的补丁应该包括封面说明,解释为什么你认为补丁是必要的或有用的。这是一个不针对软件的用户,但发送给您要接收的维护者补丁。

笔记可以很短,事实上,一些最有效的我见过的封面注释只是说“请参阅此中的文档更新补丁”。但它应该表现出正确的态度。

正确的态度是有益的,尊重维护者的时间,平静自信但谦逊。最好表现出对你正在修补的代码。很好地表明,您可以认同维修人员的问题。坦诚面对任何风险也很好在使用贴片时感知。以下是几种类型的示例我喜欢在封面注释中看到的解释性评论:

"我看到这个代码有两个问题,X和Y。我解决了问题X,但我没有尝试解决问题Y,因为我认为我不理解我认为涉及的代码部分。"

"修复了当一个foo输入过长时可能发生的核心转储。当我在那里的时候,我去其他地方寻找类似的溢出。在blarg.c的666号线附近发现一个可能的。你确定是发送者吗每次传输不能生成超过80个字符?"

"你考虑过用Foonly算法解决这个问题吗?那里是一个很好的实现<http://www.somesite.com网站/~jsmith/foonly.html>。"

"这个补丁解决了眼前的问题,但我意识到它使内存分配方式令人不快。对我有用,但你应该可能在装运前在重载下进行测试。"

"这可能是featurititis,但无论如何我都会发送它。也许你会知道以更干净的方式实现该功能。"


2.8. 在代码中包含有用的注释

通常作为一名维护者,我想对自己在合并之前了解您的更改。这不是一成不变的规则;如果你有良好的工作记录,我可能会和你一起在半自动检查之前,会对更改进行随意的检查。但您可以做的一切都是为了帮助我理解您的代码并减少我的不确定性增加了我接受你的补丁的机会。

你代码中的好评论有助于我理解它。差评论不要。

下面是一个不好的评论示例:

/*诺曼新手于2009年8月13日修复*/

这不传达任何信息。这只是一片泥泞的土地你在我的代码中间植入的引导。如果我拿走你的补丁(你说的可能性不大)我几乎肯定会去掉这个评论。如果你想获得学分,请为项目提供一个接插带新闻历史文件。我将可能会接受。

下面是一个好的评论示例:

/**需要保护此条件,以便crunch_data()*永远不会传递NULL指针<norman_newbie@foosite.com>*/

此注释表明您不仅理解我的代码,而且还理解这类信息我需要对您的更改有信心。这种评论给予我对你有信心变化。


2.9. 每个补丁只有一个错误修复或新功能。

不要收集各种错误修复、新功能或其他东西将它们作为一个diff文件发送。相反,为每个错误修复或功能。应使用电流生成每个差异代码的版本,不应依赖于您或其他人的任何其他修补程序之前发送的其他。

这有助于维护人员阅读和理解您的代码,并且他可以决定他是否接受或放弃这个单一的错误修复或功能。例如,如果您添加了一个为每个人提供完全根访问权限的功能因为它在您的特殊设置中很有用,所以维护人员可能不会接受补丁的这一部分。当您发送单个差异文件时这个根访问功能以及一些错误修复和其他有用的功能很有可能维护者会忽略您的完整补丁。

将每个错误修复和新功能作为单个diff文件例如,维护人员可以在几分钟内修复您的错误,稍后再进行仔细查看您的新功能或安全问题。

依赖于其他修补程序的修补程序会引发类似问题。如果维护者拒绝了您的基本补丁,他将无法应用其他。如果您无法避免这种依赖性,请向维护人员提供你将把补丁与他想要的部分或功能捆绑在一起添加。


3.良好的项目和档案命名实践

作为Metalab等档案维护人员的负担,PSA站点和CPAN增加,提交的数据有增加的趋势部分或全部由程序处理(而不是完全由人类)。

这使得项目和归档文件名更加重要以适应计算机程序可以解析和理解。


3.1. 将GNU样式的名称与词干和major.minor.patch编号一起使用。

如果您的存档文件都具有类似GNU的特性,这对每个人都有帮助names—全小写字母数字词干前缀,后跟破折号,后面是版本号、扩展名和其他后缀。

假设您有一个在版本1中称为“foobar”的项目,版本2,级别3。如果它只有一个存档部分(可能是源代码),其名称应如下所示:

foobar-1.2.3目标.gz

源存档

食材.lsm

LSM文件(假设您提交给Metalab)。

拜托不要使用这些:

食品123.tar.gz

在许多程序看来,这就像一个存档对于没有版本号的名为“foobar123”的项目。

foobar1.2.3.tar.gz(目标)

这在许多程序中看起来像一个存档对于2.3版中名为“foobar1”的项目。

foobar-v1.2.3.tar.gz

许多程序认为这与名为“foobar-v1”的项目。

foo_bar-1.2.3目标.gz

下划线很难让人说话,输入并记住。

食品棒-1.2.3.tar.gz

除非你喜欢看起来像个营销威尼。这对人们来说也很难说话、打字和记得。

如果必须区分源存档和二进制存档,或在不同类型的二进制文件之间,或表示某种构建选项,请将其视为文件扩展名之后版本号。也就是说,请这样做:

食品-1.2.3.src.tar.gz

来源

foobar-1.2.3.bin.tar.gz

二进制文件,未指定类型

foobar-1.2.3箱.ELF.tar.gz

ELF二进制文件

foobar-1.2.3bin.ELF.static.tar.gz

静态链接的ELF二进制文件

foobar-1.2.3bin.SPARC.tar.gz

SPARC二进制文件

拜托不要使用类似这样的名称`foobar-ELF-1.2.3.tar.gz’,因为程序很难判断从茎上键入内缀(如“-ELF”)。

一个好的通用名称应按以下顺序排列:

  1. 项目前缀

  2. 短跑

  3. 版本号

  4. “src”或“bin”(可选)

  5. 点或破折号(首选点)

  6. 二进制类型和选项(可选)

  7. 存档和压缩扩展


3.2. 但在适当的地方尊重当地惯例

一些项目和社区对名称和不一定与上述建议兼容的版本号。例如,Apache模块通常命名为mod_foo,并且具有他们自己的版本号和使用的Apache版本工作。同样,Perl模块的版本号可以被视为浮点数(例如,您可能会看到1.303而不是1.3.3),以及这些发行版的版本通常命名为Foo-Bar-1.303.tar.gz模块Foo::Bar的1.303。(另一方面,Perl本身切换到使用1999年末本文件中描述的约定。)

寻求并尊重专业惯例社区和开发商;对于一般用途,请遵循上述步骤指导方针。


3.3. 尽量选择唯一且易于键入的名称前缀

词干前缀应该易于阅读、键入和记忆。所以请不要使用下划线。不大写或双大写非常好的理由-它扰乱了自然的人眼搜索秩序等。

当两个不同的项目有相同的主干时,人们会感到困惑名称。因此,在首次发布之前,请尝试检查碰撞。谷歌是你的朋友-如果你正在考虑的茎得到了很多谷歌点击,这本身可能就足以让你想出一个不同的。另一个检查的好地方是应用程序索引位于自由代码SourceForge公司; 进行姓名搜索那里。


4.良好的许可和版权实践:理论

您选择的许可证定义了您希望建立的社会合同在您的联合开发人员和用户之间。你对软件的版权将主要作为您设置许可证权利的法律主张关于软件和软件衍生作品的术语。


4.1. 开源和版权

任何非公共领域的东西都有版权,可能超过一个。根据伯尔尼公约(自1978年以来一直是美国法律),版权不必明确。也就是说即使没有版权声明,作品也拥有版权。

谁算作者可能很复杂,尤其是对于由许多人开发的软件。这就是许可证的原因都很重要。通过列出材料可以使用时,它们将保护用户免受任意攻击的权限授予用户版权所有者的行为。

在专有软件中,许可条款旨在保护版权。它们是授予某些权利的一种方式用户,同时为所有者(版权所有者)。版权所有者非常重要,许可逻辑如此严格,以至于许可条款通常并不重要。

在开源软件中,情况通常正好相反;版权的存在是为了保护许可证。唯一的权利版权所有者始终坚持执行许可。否则,只有少数权利被保留,大多数选择都传递给用户。特别是,版权所有者不能更改您的副本上的条款已经有了。因此,在开源软件中,版权所有者这几乎无关紧要,但许可条款非常重要。

通常项目的版权所有者是当前的项目负责人或赞助组织。项目转移至一个新的领导者经常会通过改变版权所有者来发出信号。然而,这并不是一个硬性规定;许多开源项目有多个版权持有人,并且没有记录在案的这导致了法律问题。

一些项目选择将版权授予自由软件基金会,关于它有兴趣为开源和律师辩护的理论可以这样做。


4.2. 什么是开源

出于许可目的,我们可以区分几个不同的许可证可能传递的各种权利。权利复制并重新分配,权限使用,权利修改以供个人使用,以及重新分发修改的副本。许可证可以对这些权利进行限制或附加条件。

这个开放源代码主动权是大量思考的结果制作软件“开源”或(旧术语)“自由软件”。其对许可证的限制要求:

  1. 授予无限复制权。

  2. 授予无限使用权。

  3. 授予无限修改权供个人使用。

准则禁止限制修改二进制文件;这满足了软件分销商的需求需要能够在没有阻碍的情况下发送工作代码。它允许作者要求将修改后的源重新分配为原始源源代码加上补丁,从而确定作者的意图和“审计跟踪”其他人的任何更改。

OSD是“OSI认证开源”的法律定义认证标志,以及“自由软件”作为任何人都曾想出过。所有标准许可证(MIT、BSD、,Artistic和GPL/LGPL)满足了这一要求(尽管有些,如GPL,还有其他选择之前您应该了解的限制)。

请注意,仅允许非商业使用的许可证有资格获得开源许可证,即使他们装饰有“GPL”或其他一些标准许可证。他们歧视特定职业、个人和群体。它们使CD-ROM发行商和其他人的生活过于复杂试图在商业上传播开源软件。


5.良好的许可和版权实践:实践

以下是如何将上述理论转化为实践的方法:


5.1. 让自己或FSF成为版权所有者

在某些情况下,如果您背后有一个赞助组织律师,您可能希望将版权授予该组织。


5.2. 使用符合开源定义的许可证

开源定义是社区的黄金标准许可证。OSD本身不是许可证;相反,它定义了许可证必须保证的最小权利集被视为开源许可证。OSD和支持材料,可以在开源倡议.


5.3. 如果可以避免的话,不要编写自己的许可证。

广为人知的符合OSD的许可证已经确立解释传统。开发人员(以及他们关心的用户)了解它们的含义,并合理地承担风险和权衡他们参与其中。因此,请使用OSI站点(如果可能)。

如果您必须编写自己的许可证,请确保获得认证由OSI提供。这将避免很多争论和开销。除非你已经经历过了,你不知道执照有多糟糕火焰战争可以得到;人们之所以充满激情,是因为许可证被视为触及开源社区。

此外,既定解释传统的存在可能如果你的驾照曾在法庭上接受过测试,那么证明这一点很重要。时间写作(2002年初)没有支持或无效的判例法任何开源许可证。然而,这是一种法律原则(至少在美国,可能还有其他公法国家,如英国以及英联邦其他地区)法院应该根据预期和它们起源的社区的实践。


5.4. 使您的许可证在标准位置可见。

随着越来越多的开源软件的部署,审核这些卷的许可证覆盖问题成为重要的是,事实上,它比一个独立的人要大因此,具有支持许可信息的机械化查询。幸运的是,现有社区实践已经朝着这个方向发展。

首先,您的软件的许可证信息应该位于顶级目录中名为COPYING或LICENSE的文件中您的源分发。如果单个许可证适用于整个分发时,该文件应包含许可证的副本。如果有多个许可证适用,该文件应列出适用的许可证和指示它们应用于哪些文件和子目录。


6.良好的开发实践

其中大多数涉及确保所有系统的可移植性POSIX和POSIX类系统。广泛便携不仅值得专业和礼貌的形式,这是很有价值的保险针对Linux中未来的更改。

最后,其他人尝试构建您的非Linux系统上的代码;可移植性减少了支持量您收到的电子邮件。


6.1. 选择您能使用的最便携的语言

选择一种开发语言,将它将在其中运行的底层环境。C/C++程序是可能比Fortran更便于移植。Java优于C/C++,Perl、Python或Ruby等高级脚本语言是最好的选择(因为脚本语言只有一种跨平台实施)。

符合条件的脚本语言包括Python、Perl、Tcl、EmacsLisp和PHP。历史Bourne shell(/bin/sh)确实如此合格;有太多不同具有微妙特性的实现,以及shell环境会受到用户自定义(如shell)的干扰别名。

如果选择编译语言(如C/C++),请不要使用编译器扩展(例如在堆栈,或通过空指针指示)。定期使用尽可能多地使用不同的编译器和测试机器。


6.2. 不要依赖专有代码

不要依赖专有语言、库或其他代码。在开源社区,这被认为是粗鲁的。开放源代码开发人员不信任他们无法查看源代码的代码。


6.3. 构建系统

开源发行版的一个显著优点是它们允许每个源代码包在编译时都要适应它找到的环境。您需要做出的一个选择是“构建系统”,即您需要的工具箱(和其他人)将依赖于将您的源转换为可执行文件。

构建脚本不能做的一件事是要求用户提供系统编译时的信息。安装软件包的用户不会必须知道问题的答案,所以这种方法注定要失败从一开始。调用构建系统工具的软件必须能够自行确定编译时可能需要的任何信息,或安装时间。

构建系统最佳实践的社区理念现在(最近)2010年)在一个开始的一些变化。


6.3.1. GNU autotools:淡出但仍为标准

HOWTO以前的版本敦促使用GNU autotools来处理可移植性问题,进行系统配置探测,并定制您的生成文件。这仍然是标准和最流行的方法,但它确实是由于GNU autotools显示出它的时代,问题变得越来越严重。自动工具总是一堆一堆的漏洞,一堆又一堆的漏洞语言的混杂和一些严重的设计缺陷。这个多年来,由此产生的混乱是可以忍受的,但随着项目的发展更为复杂的是,它正日益失败。

不过,使用C源代码构建的人希望能够输入“configure;make;makeinstall”并获得干净的构建。如果你选择如果是非autotools系统,您可能希望模拟此行为(这应该很容易)。

有一个关于autotools的好教程在这里.


6.3.2. SCons:领导一个拥挤的领域

取代autotools的竞赛还没有胜出,但已经胜出领先者:SC个.S个取消生成文件;它结合了autotools将序列构建为一个步骤。它提供跨平台构建在Unix/Linux、Maoc OS X和Windows上使用单一配方。它是用Python编写,可以用Pytython扩展,在某种程度上可以驾驭这种语言越来越流行。


6.3.3. CMake和其他

SCons仍然是少数人的选择,并且与其他几个,其中CMake和WAF可能是最多的突出的。考虑到来源,公平的交叉比较,可以是建立在SCons wiki上.


6.4. 在发布之前测试代码

一个好的测试套件允许团队为测试,然后在发布之前轻松运行回归测试。创建强大、可用的测试框架,以便您可以增量添加测试无需培训开发人员测试套件的复杂性。

分发测试套件允许用户社区进行测试将端口分配回组之前。

鼓励您的开发人员使用各种各样的平台他们的桌面和测试机器,使代码不断作为正常开发的一部分,测试可移植性缺陷。


6.5. 发布前检查代码是否正确

如果您使用GCC编写C/C++,请使用-Wall和在每次发布之前清除所有警告消息。编译代码每个编译器都有不同的编译器不同的问题。具体来说,在真64位上编译软件机器。底层数据类型可以在64位计算机上更改,并且经常会在那里发现新的问题。查找UNIX供应商的系统并运行软件上的lint实用程序。

运行用于内存泄漏和其他运行时错误的工具;电动围栏瓦尔格林德开源中有两个很好的版本。

对于Python项目PyChecker软件程序可以是一个有用的检查。它还没有超过测试版,但无论如何经常捕捉到一些重要的错误。

如果您正在编写Perl,请使用Perl-c检查代码(可能还有-T、 如果适用)。虔诚地使用perl-w和“Use strict”。(请参阅Perl文档以供进一步讨论。)


6.6条。健全性-在发布之前检查您的文档和README

拼写检查文档、自述文件和错误消息在您的软件中。邋遢代码,当编译和README文件或错误消息中的拼写错误用户相信其背后的工程也是偶然的草率的。


6.7. 推荐的C/C++可移植性实践

如果您正在编写C,请随意使用完整的ANSI特性。具体来说,一定要使用函数原型,这将有助于您发现跨模块不一致。老式的K&R编译器是历史。

不要假设编译器特定的功能,例如GCC“-pipe”选项或嵌套函数可用。这些都会出现咬你第二个人端口到非Linux,非GCC系统。

可移植性所需的代码应隔离到单个区域和一组源文件(例如,“os”子目录)。具有可移植性的编译器、库和操作系统接口问题应该抽象到这个目录中的文件中。这包括变量(如“errno”)、库接口(如“malloc”)和操作系统接口,如“mmap”。

可移植性层使新的软件端口更容易实现。它是通常情况下,开发团队的任何成员都不知道移植平台(例如,有数百种不同的嵌入式操作系统,没有人知道任何重要的部分)。通过创建单独的可移植层知道端口平台的人可以在没有来理解它。

可移植层简化了应用程序。软件很少需要更复杂的系统调用(如mmap或stat和程序员通常配置这样复杂的接口错误地。具有抽象接口的可移植层(“__file_exists”而不是调用stat)仅允许导出系统中有限的、必要的功能,简化了应用程序中的代码。

始终编写可移植层以根据功能进行选择,从不基于平台。尝试创建单独的可移植层对于每个支持的平台,都会导致多次更新问题维护噩梦。始终至少在两个平台上选择“平台”axes:编译器和库/操作系统版本。在一些例如,当Linux供应商选择C库时,有三个轴独立于操作系统版本。有M家供应商,N家编译器和O操作系统版本,“平台”数量快速扩展到除了最大的开发团队之外的任何团队都无法触及的范围。通过使用ANSI和POSIX 1003.1等语言和系统标准,特征集是相对受限的。

可移植性选择可以沿着代码行或编译文件。如果你选择了替代方案,那也没什么区别平台上的代码行或几个不同的文件之一。一条规则拇指是将不同平台的可移植性代码移动到单独的当实现出现明显分歧时的文件(共享内存UNIX与Windows上的映射),并将可移植性代码保留在单个当差异最小时(使用gettimeofday,clock_gettime、ftime或time以查找电流时间)。

避免使用“off_t”和“size_t”等复杂类型。它们各不相同从一个系统到另一个系统的大小,特别是在64位系统上。限制您的在可移植层使用“offt”,以及使用“sizet”只表示内存中字符串的长度,其他什么都不表示。

不要踩到系统任何其他部分的名称空间,(包括文件名、错误返回值和函数名)。在哪里?名称空间是共享的,记录您使用。

选择编码标准。关于标准选择的争论可以永远持续下去——无论如何,这太难了,太贵了维护使用多种编码标准构建的软件,等等必须选择编码标准。无情地执行编码标准,因为代码的一致性和清洁性是最重要的;编码标准本身的细节是遥不可及的。


7.良好的分销实践

这些准则描述了您的分发在以下情况下的外观有人下载、检索并解压缩它。


7.1. 确保tarball总是解压缩到一个新目录中

新手开发人员犯的最令人讨厌的错误就是构建将发行版中的文件和目录解压缩到当前目录,可能会步进已经位于其中的文件。永远不要这样!

相反,请确保存档文件都有一个公共目录部分以项目命名,因此它们将分解为单个顶级直接目录在下方当前版本。

这里有一个makefile技巧,假设您的分发目录是名为“foobar”且SRC包含您的分发文件列表,实现这一点。SRC还可以包含以下子目录的名称:被完整地包括在内。

foobar-$(VERS).tar.gz:@查找$(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条。进行自述

有一个名为自述文件阅读。这是你的来源路线图分配。按照古老的惯例,这是第一个无畏的档案探险家将在解压缩源代码后阅读。

自述文件中的优点包括:

  1. 项目的简要描述。

  2. 指向项目网站的指针(如果有一个)

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

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

  5. 生成/安装说明或指向文件的指针包含相同的(通常安装).

  6. 维护者/学分列表或指向包含相同内容的文件(通常信用).

  7. 最近的项目新闻或指向文件的指针包含相同的(通常新闻).


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

在阅读自述之前,你勇敢的探险家会已经扫描了解压缩文件的顶级目录中的文件名分配。这些名字本身可以传递信息。遵循某些标准命名实践,您可以探险家关于下一步要看什么的宝贵线索。

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

README或READ。

路线图文件,首先读取

安装

配置、构建和安装说明

作者

项目出资人名单。

一个古老的、仍然可以接受的惯例是将其命名为CREDITS

新闻

近期项目新闻

历史

项目历史记录

复制

项目许可条款(GNU公约)

许可证

项目许可条款

显示

分发中的文件列表

常见问题解答

纯文本常见问题文档项目

标签

Emacs或vi使用的生成标记文件

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

有一个常见问题解答可以帮你省去很多悲伤。当关于项目经常出现,把它放在常见问题解答中;然后指导用户阅读发送问题或错误报告前的常见问题解答。培养良好的常见问题解答可以减少项目维护人员的支持负担震级或以上。

每个版本都有一个带有时间戳的历史或新闻文件是有价值的。除其他外,如果你曾经受到专利侵权诉讼的打击(这还没有发生在任何人身上,但最好做好准备)。


7.4. 可升级性设计

随着新版本的发布,您的软件将随着时间的推移而更改。一些这些变化中的任何一个都不会向后兼容。因此,您应该认真考虑设计安装布局您的代码的多个安装版本可以在同一个版本上共存系统。这对图书馆尤其重要——你不能依靠所有客户端程序与您的API更改。

Emacs、Python和Qt项目具有良好的处理约定这;版本号目录。以下是如何安装Qt库层次结构外观(${ver}是版本号):

/usr/lib/qt/usr/lib/qt-${ver}/usr/lib/qt-${ver}/bin#查找moc的位置/usr/lib/qt-${ver}/lib#查找位置.so/usr/lib/qt-${ver}/include#查找头文件的位置

有了这个组织,您可以有多个版本共存。客户端程序必须指定其库版本想要,但这是因为没有接口而付出的一个小代价打断他们。


7.5. 提供校验和

为二进制文件(tarball、RPM等)提供校验和。这个将允许人们验证他们没有被损坏或其中插入了特洛伊木马代码。

虽然有几个命令可以用于此目的(例如作为总和校验和)最好使用加密哈希函数。GPG包提供了以下功能功能,通过-分离设计期权;GNU也是如此命令md5总和.

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


8.良好的文件编制规范

最重要的良好文档实践是写一些!太多程序员忽略了这一点。但这里有两个很好的这样做的原因:

  1. 您的文档可以是您的设计文档。最好的编写时间是在您键入一行代码之前,当你思考你想做什么的时候。你会发现描述您希望程序在自然环境中工作的方式的过程语言将你的注意力集中在关于它应该是什么的高级问题上以及它应该如何工作。这可能会节省您以后的大量工作。

  2. 您的文档是对代码的质量。许多人认为一个项目的贫乏、匮乏或文盲文档是这表明程序员对潜在用户的需求草率或粗心。另一方面,好的文档传递着情报信息和专业精神。如果您的程序必须与其他程序竞争,最好确保你的文档至少和他们的一样好潜在用户不看你一眼就把你拒之门外。

HOWTO不会是开设技术写作课程的地方即使这很实际。因此,我们将重点关注格式和工具可用于撰写和呈现文档。

尽管Unix和开源社区有着悠久的传统托管强大的文档形成工具格式意味着文档往往是零散的用户很难以连贯的方式浏览或索引。我们将总结通用文档格式。然后我们会提出一些有益的建议实践。


8.1. 文档格式

以下是目前广泛使用的文档标记格式开源开发人员。当我们谈到“表示”标记时,我们的意思是显式控制文档外观的标记(例如字体更改)。当我们谈到“结构化”标记时,我们指的是描述文档的逻辑结构(如分节符或强调标记。)当我们谈到“索引”时,我们指的是过程从文档集合中提取可搜索集合用户可以使用主题指针来可靠地查找材料整个系列都很有趣。

手册页

最常见的格式,继承自Unix,它是演示文稿标记。男人(1)命令提供了一个寻呼机和石器时代的搜索设施。不支持图像、超链接或索引。渲染到Postscript以便公平打印好。不能很好地呈现为HTML(本质上是平面文本)。所有Linux系统上都预先安装了工具。

手册页格式对于命令摘要或简短引用来说不错旨在唤起有经验用户记忆的文档。它开始对于具有复杂接口和许多选项,如果需要维护一组文档,则完全折叠具有丰富的交叉引用(标记只有弱的和通常未使用的支持超链接)。

HTML格式

自1993-1994年网络爆炸以来,这种现象越来越普遍。标记为部分是结构性的,大部分是表现形式。可通过任何web浏览器浏览。对图像和超链接的良好支持。有限的内置设施索引,但存在良好的索引和搜索引擎技术广泛部署。渲染到Postscript以便打印。HTML格式工具现在普遍可用。

HTML非常灵活,适合多种文档。实际上,它是柔性;它与手册页共享格式化很难自动索引的问题,因为标记描述的是表示,而不是文档结构。

特辛福

Texinfo是自由软件使用的文档格式基金会。它是在强大的TeX格式之上的一组宏发动机。大部分是结构性的,部分是呈现性的。可通过Emacs浏览或独立的信息程序。良好的支持超链接,图像无链接。良好的打印和在线索引形式;安装Texinfo文档时,指向它的指针是自动添加到可浏览的“dir”文档中,其中列出了所有Texinfo系统中的文档。渲染为优秀的Postscript并可用HTML格式。Texinfo工具已预装在大多数Linux系统上,并且可用自由软件基金会网站。

Texinfo是一个很好的设计,对排版书籍也很有用作为小型在线文档,但像HTML一样,它是一种两栖动物-标记是部件结构、部件表示和表示部件会给渲染带来问题。

资料收集库

DocBook是一种基于SGML(更多XML上的最新版本)。与这里描述的其他格式不同,它是完全结构化,没有表示标记。出色的支持图像和超链接。良好的索引支持。很好地呈现为HTML,Postscript可以接受打印(作为工具,质量正在提高进化)。工具和文档可在DocBook网站.

DocBook非常适合处理大型、复杂的文档;它是被设计的专门用于支持技术手册并以多种形式呈现输出格式。它的主要缺点是冗长。幸运的是,很好工具和介绍级文档现已可用;请参阅DocBook解密HOWTO(世界旅游组织)作为介绍。

阿西里多克

DocBook的一个严重缺陷是其标记重量级和突兀。最近一个聪明的变通方法是AsciiDOC公司。此工具是具有更简单、更自然的输入的DocBook前端语法。用户根本不需要了解DocBook,但仍然可以几乎是这些工具的全部功能。

AsciiDOC(通常由formatter it ships)最近得到了快速发展以前转移到DocBook的项目。


8.2. 良好做法建议

自2000年以来,文件编制实践发生了变化开源项目组(包括Linux内核项目、GNOME、KDE、,自由软件基金会和Linux文档项目)同意一种比传统Unix的面向打印的方法更适合网络工具。自从XML-DocBook工具链达到2001年年中的生产状况,是这样的吗:

  1. 在XML-DocBook或asciidoc中维护文档主控形状。甚至您的手册页也可以是DocBook参考条目文件。有一个非常好的HOWTO(世界旅游组织)在编写手册页解释章节和组织您的用户会期待看到。

  2. 发送XML或asciidoc主控形状。此外,如果您的用户系统没有圣诞节(1)(自7.3起所有Red Hat发行版的标准配置),提供troff来源你可以通过在你的母版上运行转换来获得。您的软件发行版的安装过程应安装在通常的方式,但如果人们想写,可以直接指向XML/asciidoc文件文档修补程序。

    很容易判断制作(1)保存生成的man文件到目前为止。只需在生成文件中执行以下操作:

    foo.1:foo.xmlxmlto man foo.xml

    如果你使用的是腹水,应该有这样的东西:

    foo.1:foo.txtasciidoc--backend=docbook foo.txtxmlto man foo.xml
  3. 从主控形状生成XHTML(使用圣诞节xhtml格式,或直接使用阿西里多克)并做到可从项目的网页上获得,用户可以在其中按顺序浏览决定是否下载代码并加入项目。

要将troff格式的旧文档转换为DocBook,结账文档提升器.如果你是不愿意放弃使用人工源作为主格式,至少尝试一下把它们清理干净文档提升器可以举起它们自动转换为XML。


9.良好的沟通实践

如果只有你知道它的存在。此外,为互联网上的项目将帮助您招募用户和联合开发人员。以下是实现这一点的标准方法。


9.1. 向Freecode发布

请参见自由代码.分发手表查看何时发布新版本的频道。


9.2. 有一个网站

如果您打算建立任何实质性的用户或开发人员社区围绕你的项目,它应该有一个网站。标准的东西网站上包括:

  • 项目章程(为什么存在,受众是谁等)。

  • 下载项目源的链接。

  • 关于如何加入项目邮件列表的说明。

  • 常见问题列表。

  • 项目文档的HTML化版本

  • 相关和/或竞争项目的链接。

一些项目站点甚至有匿名访问主站点的URL源树。


9.3. 主机项目邮件列表

拥有私人发展清单是标准做法项目合作者可以通过它进行沟通和交流补丁。您可能还想为用户提供公告列表希望随时了解项目进程的人。

如果您正在运行名为“foo”的项目。您的开发人员列表可能是foo-dev或foo-friends;您的公告名单可能是美食。


9.4. 向主要档案馆发布

自1999年秋季推出以来,SourceForge公司已经爆炸了很受欢迎。不过,它不仅仅是一个存档和分发站点你可以这样使用它。这是一项完全免费的项目主持服务试图为开源开发小组提供一整套工具-网络和存档空间、邮件列表、错误跟踪、聊天论坛、CVS存储库和其他服务。

其他重要地点包括:

  • 这个Python软件活动站点(用于用Python编写的软件)。

  • 这个CPAN公司,的综合Perl档案网络,(用于用Perl编写的软件)。

  • github、和滑稽的,两个很受欢迎站点提供免费的git存储库访问。


10.良好的项目管理实践

当所有参与者都是志愿者时,管理好项目一些独特的挑战。这是一个太大的主题,在HOWTO中无法涵盖。幸运的是,有一些有用的白皮书可以帮助您了解主要问题。

关于基本开发组织和发布早期版本通常为“集市模式”,请参阅大教堂和集市.

为了讨论动机心理学、社区习俗、,和冲突解决,请参阅宅基地努斯球.

有关经济和适当商业模式的讨论,请参阅魔术大锅.

这些论文并不是开源开发的最后定论。但他们是第一个要写的严肃分析,而且还没有被取代(尽管作者希望有一天会被取代)。