最近,一直在苦苦寻找一个最适合自己的bug追踪系统。我自己平时写的一些小工具,有一些bug需要追踪管理一下,用记事本显得格式太随意了,不好管理。

试了很多有名的工具,如Bugzilla,Mantis,感觉都太厚重了,团队用倒是蛮合适的。

后来想着用XML定义一个日志数据库,一个Bug开一个文件,这样可以详细记录Bug的内容及解决过程、方法等。再写一个前端,用来管理组织这些XML文件。但我个人的bug量不多,更多的时候,是随手写一点想法,这种XML严谨的组织方式,并没有让我觉得更轻松。

尝试着用Emacs Muse记录了一段时间,有一个缺点,就是我写下来的解决方法里,有很多是代码,如果我不加标签,Muse会尽量地帮我重新转义一下。总的来说,Muse还是偏排版多一点,不适合于记录随想随写的东西。

最后,我发现用Perl的pod来做自己的bug追踪系统挺好的。Pod虽然是个文档系统,但是只要灵活地运用标签也是能做简单的bug追踪系统。Pod的优点是,当你不需要用命令的时候,直接输入你的内容即可,总体来说,比较简洁。

我的pod格式定义如下:

=pod

=head1 project 1

=head2 Bug #000001

=head3 Bug #000001的简单描述或标题

Bug #000001的详细描述,所有的有关内容。。

=head3 Bug Status::Fixed

=head3 Bug解决方法记录

=over indentlevel

=item 解决步骤一

解决步骤一的内容。

=item 解决步骤二

解决步骤二的内容。

=item Bug Fix summary

Solution of Bug #000001, the summary of this bug is:

Try to readcord the document in time and in style.

这里就写一写把Bug搞定后的总结。

=back

=head2 Bug #000002

=head3 Bug #000002的简单描述或标题

Bug #000002的详细描述,所有的有关内容。。

=head3 Bug Status::Active

=head3 Bug解决方法记录

=over indentlevel

=item 解决步骤一

解决步骤一的内容。

=item 解决步骤二

解决步骤二的内容。

=item Bug Fix summary

Solution of Bug #000002, the summary of this bug is:

Try to readcord the document in time and in style.

这里就写一写把Bug搞定后的总结。

=back

=head2 Bug #000003

=head3 Bug #000003的简单描述或标题

Bug #000003的详细描述,所有的有关内容。。

=head3 Bug Status::Suspended

=head3 Bug解决方法记录

=over indentlevel

=item 解决步骤一

解决步骤一的内容。

=item 解决步骤二

解决步骤二的内容。

=item Bug Fix summary

Solution of Bug #000003, the summary of this bug is:

Try to readcord the document in time and in style.

这里就写一写把Bug搞定后的总结。

=back

=cut

把上面的例子代码存成一个文档,比如说,我喜欢存为WaterBug.txt,后缀用.txt是为了方便用其它编辑器查看。

用pod2html的命令生成文档给其他人观看:

pod2html –infile WaterBug.txt –outfile WaterBug.html –title WaterBug

当然,你可以为这个文档写一个你自己的Style Sheet,生成一个打着你的logo的个性化文档:

pod2html –infile WaterBug.txt –outfile WaterBug.html –title WaterBug –css stylesheet.css

在定义我的pod格式时,我分别用ActiveSuspendedFixedOn-hold四种状态来标明Bug的状态,即”正在进行”、”还未开始”、”已经搞定”、”暂时放着”等四种状态,这些状态关键字都是以**::**开头进行标识。

以这些简单的标记来记录文档,我可以随手写在任何文本文件里,包括Google Docs这些在线文档,即使将来要转成其它格式的文档,也可以轻松地用perl来实现转换。

要查找特定状态的bug,只要搜索一下::Fixed或是::Suspended或是::Active或是::On-hold即可。