这段时间,有个跟合作公司一起做的项目,其间涉及到大量的Buglist交换。我们使用的跟踪系统是Redmine,简洁好用,但偏偏没有Bug导入功能,QA的同事只好手工操作,很是辛苦。
上周五我花了一个晚上的时间,Google来,Google去,最终找到了Piroli UENISHI做的Redmine CSV Importer。可惜这个Plugin只能导入由Redmine导出的CSV文件,并且不能处理自定义字段,还是不合用。
周六早上一醒来,发现天黑黑的,恐怕是随时都要下雨,心想今天不会有户外活动了,不如自己动手做一个Plugin吧。马上开工。
Redmine是基于Ruby on Rails的应用。以前在考察应用程序框架时,曾经看过37signals写的数篇介绍文章,还记得大概的架构。但一动手,立刻发现Ruby和Rails并不像想象中的那么容易上手。从头学肯定是小题大作了,要在这个周末做完,必须得想点速成的办法。
从以往的经验来看,速成需要借助工具,特别是集成得非常好的IDE。Google一下,嗯,最受推崇的工具是Aptana Studio,基于熟悉的Eclipse,大部分功能都支持Mac,下载来试试。
Aptana的确不错,导入Redmine的源代码,很快就跑起来了。继续看Redmine的Plugin制作教程,一步步做了一个新的插件,把大概要用到的东西熟悉了一下。其中有个2个地方花了不少时间:
- Radio field与其他field的关联动作。没有框架时,肯定是自己写一个Javascript了,但我觉得RoR应该有自己的办法。最后搜到了CSDN上的一个帖子,也是说要用Javascript。一边乱翻RoR的API文档,一边正准备放弃,突然发现ActionView::Helpers::PrototypeHelper里面有个observe_field,解决问题。
- Redmine下action间传递上传文件的名字或句柄。这个让我很挠头。本来RoR提供了ActionController::Flash,但Redmine居然把Flash Hash中的所有元素都当作需要显示的内容了。找来找去,没有更好的办法,还是自己用session来传递参数。
终于,经过充分利用周末里各种“见缝插针”的时间,0.1.0版出炉了。明天拿给同事们品评试用一番了。
4月1日补充:做好的plugin在这里发布,为了更多的Redmine用户能够用到这个插件,写成了英文版。
参考资料:
- Redmine的Plugin制作教程
- Ruby的API文档
- Ruby on Rails的API文档