[Trac 經驗談之(1)雜談篇](http://blog.csdn.net/lanphaday/article/details/6609256)
[Trac 經驗談之(2)雜談篇補遺](http://blog.csdn.net/lanphaday/article/details/6658032)
[Trac 經驗談之(3)工作流篇](http://blog.csdn.net/lanphaday/article/details/6620098)
[Trac 經驗談之(4)報表篇](http://blog.csdn.net/lanphaday/article/details/6641391)
[Trac 經驗談之(5)插件篇](http://blog.csdn.net/lanphaday/article/details/6654027)
[Trac 經驗談之(6 完)插件篇補遺](http://blog.csdn.net/lanphaday/article/details/7100118)
# Trac 經驗談之(2)雜談篇補遺
賴勇浩(http://laiyonghao.com)

### 教訓
### 一定要有模板
嗯,我說的是每一個任務單(ticket)的描述。如果沒有一個描述模板,你得到的很大可能是一堆完全不知所云的文本。使用 TicketExtPlugin 可以很方便地做到這一點(見插件篇)。下面是我使用的模板,其中需求和改進的模板由我“抄襲”自禪道。
~~~
=======================改進=========================
建議參考的模板:作為一名<某種類型的用戶>,我希望<某個功能的描述>更改為<另一個功能的描述>,這樣可以<開發的價值>。
=======================需求==========================
建議參考的模板:作為一名<某種類型的用戶>,我希望<達成某些目的>,這樣可以<開發的價值>。
=======================缺陷==========================
缺陷表現:
重現步驟:
期望結果:
~~~
### 一定要定制報表
多問一下用戶,比如老板、經理、制作人和測試人員,了解他們想要弄明白什么信息,然后建立起相關的報表給他們方便地使用。這樣才能更好的讓他們跟進項目的狀態,推進項目的進展。
### 不要定義太多字段
因為 Trac 有 Custom Fields 概念,用戶可以隨意定義字段,事實證明過多的字段一點用處都沒有。只有專業的測試人員會去設置類似功能組件、職能組件之類的選項,產品策劃等人通常無視這些“小細節”,甚至優先級、里程都都是空的,或者默認的。
### 沒有必要設置開始、結束日期
現在我們有這樣的選項的,但在我們團隊,超過 9 成的任務單沒有設置兩個字段,我相信設置了這兩個字段了的任務單,也會有 9 成都沒能在這個期間內完成。對于開發人員來說,能夠在預設的里程碑里完成任務單,就相當不錯了。
### 沒有必要安裝甘特圖、日歷圖等插件
是的,在老板看來,盯著甘特圖好像會有一種成竹在胸、一切盡在掌握的感覺。鼓起膽氣跟老板說:放棄這自我良好的感覺吧,這玩意根本不準。另外霍夫斯塔特定律必須記在心頭:軟件開發的時間總是比想象的時間長,即使注意了霍夫斯塔特定律也是如此。出處:[http://en.wikipedia.org/wiki/Hofstadter%27s_law](http://en.wikipedia.org/wiki/Hofstadter%27s_law)。
### 搜索
Trac 的搜索相當不給力,比如你搜索“中文”兩個字時,它會告訴你沒有匹配的結果,并給出一條警告:
~~~
警告: 搜索查詢太短。查詢必須至少包含 3 字符。
~~~
操蛋啊,尼瑪啊,咱這是中文啊……兩個字符可以表示整個世界了有木有!但是目前我還沒有搜索到有效的解決方案,如果你有辦法解決這個問題,請留言告知。謝謝。(2011年8月4日更新:flyinflash 朋友在本文后留言,提到了解決方案,我把它整合到了接下來的小技巧這一節中)。
### 小技巧
### 選擇 owner
只要把 Trac.ini 的設置改一下即可:
~~~
[ticket]
restrict_owner = true
~~~
不過這不是完美的解決方案,因為 Trac 默認是顯示注冊的賬號,這種英文字母+數字組合的名字對中國人太不友好了,比較好的方案是裝插件,見“插件篇”。
### 繼承 Trac.ini
經常要編輯 Trac.ini,容易出錯。其實在 Trac.ini 加一個節 [inherit],然后填好 file 設置,Trac.ini 就能從指定的 file 中繼承設置。
~~~
[inherit]
file = /path/to/global/trac.ini
~~~
如果有多個配置文件,那么需要用逗號(,)隔開。如果 Trac.ini 中又有相同的節項的話,父配置就會被 override,所以最佳實踐是 Trac.ini 只有 [inherit] 這一節,然后所有的具體設置都放在不同的文件中給 Trac.ini 繼承。
### wiki 轉 html
有時候需要把純文本格式的 Wiki 轉成 HTML 頁面,比如發表到博客什么的。這時候可以使用這個方案:[http://trac.edgewall.org/wiki/CookBook/Scripts/StandaloneWiki2Html#no1](http://trac.edgewall.org/wiki/CookBook/Scripts/StandaloneWiki2Html#no1)
### 搜索(2011年8月4日更新)
把 trac.ini 中的 [search] 這一節進行設置,即可搜索較短的單詞,如中文的“義烏”,解決上文說的搜索警告的問題(感謝 flyinflash 的貢獻)。
~~~
[search]
min_query_length = 0
~~~
### Hacking
在這個系列發表之后,朋友 @SparkleZeng 在微博上評論說(見:[http://weibo.com/1764732124/xeT2KivsG](http://weibo.com/1764732124/xeT2KivsG)):“trac最大的好處是你可以二次開發,最大的問題是你需要二次開發才用的比較舒服。”說得太對了!所以對于 Trac 用戶來說,Hacking 是必經的階段,可能只是翻開源碼直接 hard code 幾行,也可能是編寫一個插件來增進體驗或增加功能。
本來我計劃獨立地寫一篇來講 Hacking Trac 這個事的,但在寫這個系列的過程中我認識到還是介紹“使用”經驗為好,所以就把這一篇縮寫成一節。與使用 Trac 不同,想要 Hack 它,至少要讀 Trac Developer Documentation([http://trac.edgewall.org/wiki/TracDev](http://trac.edgewall.org/wiki/TracDev)),而且有不少代碼必須要了解。簡單地直接在源碼那里 hard code 幾行就不需多方了,只要用好 find/grep 這兩條命令就差不多了。
對于想要編寫插件(Plugin)的家伙來說,Trac Component Architecture([http://trac.edgewall.org/wiki/TracDev/ComponentArchitecture](http://trac.edgewall.org/wiki/TracDev/ComponentArchitecture))是必讀的,通過這篇文檔才能了解到 Trac 的心臟—— trac.core 是如何實現一個易于擴展微型的組件內核的(顯然,這對于我們設計自己的應用也有很大的借鑒和啟發作用)。

清楚 Trac 組件架構的內核機制以后,相信大家對如何編寫插件實現自己的功能已經胸有成竹了。這時候需要了解 Trac 的 Request Handling 流程([http://trac.edgewall.org/wiki/TracDev/RequestHandling](http://trac.edgewall.org/wiki/TracDev/RequestHandling)),這里有兩個漂亮的時序圖交待了整個請求處理的流程。
躍躍欲試的你現在想動手了吧,不著急,先看一下 Writing Plugins for Trac([http://trac.edgewall.org/wiki/TracDev/PluginDevelopment](http://trac.edgewall.org/wiki/TracDev/PluginDevelopment)),你可以在這里看到基礎代碼模板,如何發布、調試,還有你必須了解的 Extension Points([http://trac.edgewall.org/wiki/TracDev/PluginDevelopment/ExtensionPoints](http://trac.edgewall.org/wiki/TracDev/PluginDevelopment/ExtensionPoints))。
別以為你現在就可以開始了哦,如果你需要在數據庫存儲數據,那你還要了解清楚它的 Data Models([http://trac.edgewall.org/wiki/TracDev/DataModels](http://trac.edgewall.org/wiki/TracDev/DataModels))和Database Scheme([http://trac.edgewall.org/wiki/TracDev/DatabaseSchema](http://trac.edgewall.org/wiki/TracDev/DatabaseSchema))。
最后,為了讓全世界人民都可以用上你編寫的插件,你還需要了解一下它的本地化技術([http://trac.edgewall.org/wiki/TracL10N](http://trac.edgewall.org/wiki/TracL10N))。好吧,現在你可以動手了,最后送你一份 Trac API Docs一路伴隨你([http://trac.edgewall.org/wiki/TracDev/ApiDocs](http://trac.edgewall.org/wiki/TracDev/ApiDocs))。
2011年8月4日更新:flyinflash 留言說:Trac開發文檔可能有時會讓人困惑,Plugin 和 Component 有時指同一樣東西,應該加備注。