On this page... (hide)
- 1. 资料与文档
- 2. 第一次安装、第一次使用
- 2.1 启用用户认证
- 2.2 使用MySQL做数据存储
- 2.3 改用 Form 方式的用户认证
- 2.4 Web服务器集成
- 2.5 解决日期格式无法被正确解析问题
- 2.6 版本控制后台 Mercurial
- 2.7 Mercurial 和 Trac 中 Ticket 模块的绑定
- 2.8 解决 Mercurial 插件乱码问题
- 3. 外观定制
- 4. 功能定制
- 4.1 更灵活的权限控制
- 4.2 启用 SectionEdit
1. 资料与文档
核心站点:
- http://trac.edgewall.org
- http://trac-hacks.org/
- 金山的Trac应用经验汇总
- Apache Bloodhound:基于 Trac 的一个扩展项目,改善了易用性和多项目支持。
我自己用的上的插件:
- Account Manager Plugin 帐户管理插件,可以通过Web界面调整用户名、密码等,可以使用多种认证信息存储后台,支持Form方式认证,非常方便!
- No Anonymous Access 将所有匿名用户重定向到登陆页面的插件。
- Editor for Fine Grained Authz Permissions File Trac自身使用Fine grained permissions机制来细化资源的权限控制(比如细化到Wiki上特定页面一级),而这个插件是细化权限控制的可视化编辑工具。
- Edit a single wiki section 只编辑页面中单独一节的插件。可是我在 0.12 开发版上用显示不出来单独一节的编辑链接。。
可能有用的插件:
- Agilo 应该是功能最丰富的帮助 Trac 支持 Scrum 的插件。
- Agile-Trac Plugin 增强Trac功能,使之更适应敏捷软件开发过程管理。
- Sub Projects 允许项目下设子项目的插件。
- Self-contained Blog plugin 优秀的博客插件。
- HgTimelinePlugin 让Trac内的资源指向外部hgweb而不是内嵌的源代码浏览器(与hg后台插件相比,能够同时支持多个hg代码库)。
- Page2DocbookPlugin 将Wiki页面打包成DocBook格式保存的插件。
- Distributed Peer Review Plugin 提供一个复查Svn上代码的易用Web界面。
- turn repository hooks into pluggable extension points 帮助svn的hook脚本与Trac联动的插件,该页面上还提及了其他能够完成类似功能的插件地址。
- Team calendar 一个简单的团队日历插件,主要用于设置特定工作人员的在岗或不在岗状态。
- Listing modified files per ticket in Trac 列举一个ticket涉及修改哪些文件的插件。
- Plugin to render burndown SVG 动态生成Burn-Down图的插件。
- Timing and Estimation Plugin 用于辅助动态统计开发时间轴及进度估计的插件。
- Ticket Validator 当工作流上的Ticket置为特定状态时,进行属性检查的插件,可用于帮助确认Ticket确实经过了所需的实体处理。
- TracBacks Plugin 当Ticket A提及Ticket B时,在Ticket B生成相应的反向链接的插件。
- Plugin that provides project progress statistics and quality metrics 生成项目Ticket统计和变化趋势图的插件。
- TracTabPlugin 在Trac页面上添加自定义标签的插件。
- Trac Ticket Statistics 又一个对Ticket进行统计的插件。
- Work Log Plugin for Trac 记录谁正在哪个Ticket上工作的插件。
- Convert email to trac tickets 通过Email向Trac发布条目的插件。
- ZoomQuiet的Trac中文汉化
- ZoomQuiet在金山内部使用的一些插件
2. 第一次安装、第一次使用
安装文档见:http://trac.edgewall.org/wiki/TracInstall (附:Trac官方网站)
最简单的办法是使用easy_install,使用以下语句就可以完成Trac安装:
然后得使用Trac的命令行管理工具来初始化一个代码项目,管理工具会问一些问题来完成初始设置:
然后就可以用Trac自带的http服务器来启动服务了:
现在可以用浏览器访问:http://localhost:8000/ 就能够见到刚才创建的代码项目。
从 svn 安装最新的开发版代码也不复杂,参考Trac Installation Guide for 0.12dev。按照页面上的说明准备好各对应版本的依赖包,然后
python ./setup.py compile_catalog -f
python ./setup.py install
开发版 Trac 依赖的有些库也是 svn 上的开发版,比如 Genshi 。可以用类似 Trac 开发版的安装方法或者
2.1 启用用户认证
进一步的设置需要设置trac.ini文件(在创建的代码项目的conf目录下),Trac 0.11以后也集成了Web界面的管理工具来维护trac.ini文件,但Web管理界面要求当前登录在Trac上的用户有管理员权限,否则会报“No administration panels available”的错误。因此现在我们来为Trac启用用户认证功能。
用tracd方式启动的服务要开启用户认证,相关的文档可参考:http://trac.edgewall.org/wiki/TracStandalone 这里使用的是Apache里面带的htdigest工具来创建认证文件:
然后将users.htdigest文件拷贝到trac.ini相同的目录下。改为使用以下语句来启动Trac:
现在就可以用elias用户登录了。我们还得给新建的用户赋以管理员权限。相关的文档参考:http://trac.edgewall.org/wiki/TracPermissions 比如给elias用户管理员权限,那么可以这样操作:
2.2 使用MySQL做数据存储
MySQL 支持不是必须的,默认情况下 Trac 会使用 Sqlite 作为数据存储引擎。用户较多时可以用 MySQL 或 PostgreSQL 作为存储引擎提高并发性能,其中 MySQL 相关的配置方式参考:http://trac.edgewall.org/wiki/MySqlDb 。Trac 用到了事务,所以要求 MySQL 启用 InnoDB 支持;另外正确处理中文最关键的步骤是在创建 MySQL 数据库时选择为 utf-8 编码就可以了。
MySQL-Python在DarwinPorts下面编译得有点问题,如果用localhost会直接导向DarwinPorts下的MySQL,如果未开启就会造成连接失败。用127.0.0.1就可以正常连接到非DarwinPorts的MySQL。
0.11.1版本只要在MySQL库启用utf-8就能正确存储和显示中文(不用修改trac.ini中的默认编码)。
- 之前在mac中执行trac-admin遇到编码错误时,修改了text.py文件的tounicode函数实现,使之忽略locale的设置,永远使用utf-8进行编码,不确定这是否有关。
- 由于同样的原因,修改了trac/util/datefmt.py的113行,在其之前加入encoding = 'utf-8'
2.3 改用 Form 方式的用户认证
安装插件Account Manager Plugin,并按照其说明进行配置。插件的功能基本上都可以通过 Web Admin 的界面开启/关闭,只是如果用 form 认证代替 HttpAuth ,则除了在 Web 界面调整之外,还需要在 trac.ini 文件的“[components]”一节中加入
2.4 Web服务器集成
我选用的是 FastCGI 方式的 lighttpd,参见:http://trac.edgewall.org/wiki/TracFastCgi 。
一般应该按照http://trac.edgewall.org/wiki/TracCgi 页面最开始的说明,用
最后我的 lighttpd 配置是这样的:
server.document-root = "/var/www/trac/htdocs"
alias.url = (
"/chrome/" => "/var/www/trac/htdocs/",
)
# rewrite for multiple svn project
url.rewrite-final = (
"^/[^/]+/chrome/(.*)" => "/chrome/$1",
)
$HTTP["url"] =~ "^(?!/chrome)"{
fastcgi.server = (
"/" => ( # if trac_prefix is empty, use "/"
(
# options needed to have lighty spawn trac
"bin-path" => "/var/www/trac/htdocs/cgi-bin/trac.fcgi",
"max-procs" => 1,
"bin-environment" => (
"TRAC_ENV" => "/var/www/trac",
"PYTHONPATH" => "/usr/lib/python2.5/site-packages",
"PYTHON_EGG_CACHE" => "/tmp/trac/",
),
# options needed in all cases
"socket" => "/tmp/trac.sock",
"check-local" => "disable",
# optional
"disable-time" => 1,
# needed if trac_prefix is empty; and you need >= 1.4.23
"fix-root-scriptname" => "enable",
),
),
)
} # end of $HTTP["url"] =~ "^/trac_prefix"
} # end of $HTTP["host"] == "trac.example.com"
在 1.4.23 之前版本的 lighttpd 有个 Bug ,当 fastcgi.server 的绑定路径为“/”时,会使得动态程序丢失部分路径,参见:http://trac.edgewall.org/ticket/2418 。如果不方便升级 lighttpd (比如 Debian Lenny 下),那么可以修改 trac.fcgi 为如下内容来绕过这个问题:
from trac.web.main import dispatch_request
def application(environ, start_request):
environ['PATH_INFO'] = environ['SCRIPT_NAME'] + environ['PATH_INFO']
environ['SCRIPT_NAME'] = ''
return dispatch_request(environ, start_request)
_fcgi.WSGIServer(application).run()
Apache在Mac下的mod_fastcgi安装步骤见:http://rikugun.javaeye.com/blog/258616
- 需要用到xampp源代码中的build和include目录。
- fcgi目录不能放到htdocs下面。
- trac.fcgi要有可执行权限
- .egg目录里面有deploy_trac.fcgi作为trac.fcgi的模板,只要替换首行的python路径,以及加入Trac资源所在路径即可。
- trac官方的cgi方式设置说明的映射htdocs是不必要的,但怀疑不做会影响服务器效率。
- AuthName和AuthDigestDomain都要写成htdigest生成密钥时使用的域,才能正确完成登陆。
2.5 解决日期格式无法被正确解析问题
在“时间线”(TimeLine)等栏目中,提供有条件过滤查询框,其中的一个参数是查询起始时间。依据服务器 locale 设置不同,有时这个时间会显示为中文的本地化版本,比如“2010年8月17日”,但在直接提交这个过滤条件时,这个时间格式又无法被正确解析(目前是 Babel 0.9 版本,还没有实现本地化时间格式的解析,以后版本可能会解决这个问题)。这样每次手工修改时间格式比较麻烦,所以参考How do I change the format used for displaying date and time?,把 Trac 使用的时间格式转为英文处理。
具体地,我是在 lighttpd 的 "bin-environment" 中增加如下行解决(注意:这里给 LC_TIME 设置的 locale 必须是系统中目前存在的 locale ,否则 Trac 会报错):
2.6 版本控制后台 Mercurial
安装配置文档参见:http://trac.edgewall.org/wiki/TracMercurial ,目前最新版的 Trac 和 TracMercurial 都已经集成了多版本库支持,所以可以参考http://trac.edgewall.org/wiki/MultipleRepositorySupport 配置多个 Mercurial 版本库集成。再有,TracMercurial 是不需要像 svn 集成那样使用 post-commit 钩子的,而是会自动在需要时访问和解析 Mercurial 仓库的代码结构。
Mecurial集成插件(TracMercurial)以前对超过几十M量级的版本库存在严重的性能问题。但其实有办法搞定,在Ticket 7746页面有补丁能够改善这一性能问题,该页面上的最新补丁已经能够将这一块的处理性能提升几个数量级,于是TracMercurial对大型的源代码库重新变得好用。TracMercurial的维护者已经将这个补丁提交到了2008年12月5号以后的正式版本中。
Debian Lenny 下自带的 Mercurial 版本是 1.0.1 ,会报“TypeError: 'mqrepo' object is unsubscriptable”错误,参见:http://trac.edgewall.org/ticket/8986 。可以利用 lenny-backports 里头的mercurial 和 mercurial-common 包来升级解决。
2.7 Mercurial 和 Trac 中 Ticket 模块的绑定
利用HgTracHook,可以比较简单地实现 Mercurial 和 Ticket 模块的联动。也即,如果在 Mercurial 日志中提及 Ticket 编号,对应 Ticket 的描述文本中能够自动加入指向该 ChangeSet 的链接;而且还可以通过日志修改 Ticket 的状态。
比如日志中写“fix #1”就会把编号为 1 的 Ticket 状态设置为 Fixed ;写“see #1”虽不改变 Ticket 状态,但会在 Ticket 中加入一条评论,提供指向该修改集的链接。一次 commit 引用多个 Ticket 可以这样写: see #1, #3, #5.
如果是在 mercurial-server 中通过设置 .hgrc 启用 hook ,可以参考如果在服务器端启用 hook。
2.8 解决 Mercurial 插件乱码问题
如果使用 Mercurial 作为 Trac 的代码库后台以后,浏览非 ASC II 的更新日志和代码内容出现乱码,那么需要设置 conf/trac.ini 文件中的“default_charset = utf-8”,然后重启 Web 服务器即可正常显示。有可能因为 Trac 的运行模式(比如 mod_wsgi 下),这样设置以后仍然乱码,那么就要给 Trac 设置环境变量 “HGENCODING=utf-8”,比如 lighttpd 下看起来可能就像这样:
"bin-environment" =>
("TRAC_ENV_PARENT_DIR" => "/var/lib/trac/" ,
"LC_TIME" => "bg_BG.UTF-8",
"PYTHON_EGG_CACHE" => "/tmp/.python_eggs",
"HGENCODING" => "utf-8")
....
----
这个解决乱码的办法能正常工作的前提是 Mercurial 版本库中的所有内容都使用 utf-8 编码(包括文件名、路径名和文件内容)。但有些情况还是可能不小心使用到其他的文件名编码(比如 Windows 就有可能把文件名弄成 GB18030),而这些文件名编码错误的内容会永远存在于 Mercurial 的版本历史中(除了 rollback 之外我还没找到能修改 Mercurial 版本历史的办法,而 rollback 只能回滚本地刚刚完成的仅仅一次提交,这点儿后悔药是不够的。。),导致在 Trac 中浏览源代码时遇到类似下面的错误:
相关的解决办法参考:UnicodeDecodeError when file names in Mercurial repo use multi encoding。这个条目其实是我提交的,其中包含一个很简陋的补丁。
为避免这种编码混乱的情况,参考HgMini#encoding“避免乱码”章节中的提示。
3. 外观定制
定制外观其实应该用 Site Appearance机制 或者 Themes机制。
目前偷懒直接改的 common/css/trac.css ,把 body 的 margin 改成了 auto、增加 max-width 并设置为 72em,这样使页面整体不是太宽,在读 Wiki 或者读 Ticket 的时候感觉舒服一些。
4. 功能定制
4.1 更灵活的权限控制
如果是闭源项目使用 Trac ,启用No Anonymous Access,以禁止未登陆用户访问。
cd noanonymousplugin/0.11
python setup.py install
从 0.12 版本开始,Fine grained permissions已经内置在主代码树中了,在 Web Admin 的插件管理界面找到“tracopt.perm.authz_policy.*”插件,启用,点加号展开说明,按照说明进行配置即可。
之后为了维护权限方便,继续配置Editor for Fine Grained Authz Permissions File。注意页面上的配置说明,它要求必须设置一个“group_file”变量,指向一个类似 Linux 中 /etc/group 文件格式那样的文件。如果用户组完全由 authz_policy 来控制,那么只要让“group_file”指向一个空文件或者每一行第一个字符都是 # 的文件即可(不能指向不存在的文件,否则访问这个权限编辑器的时候会报错)。注意 authz 配置文件的现有内容格式必须正确,否则无法正常显示当前文件内容。
authz 权限配置文件中内容的顺序是越靠上的设置优先级越高。各种权限的具体含义参见:Trac Permissions。
4.2 启用 SectionEdit
在一个 Wiki 页面中内容较多时,对整个页面进行修改会觉得比较麻烦,不但每次传输的数据量过大,而且也很难定位想要修改的位置。一个不错的解决办法是启用SectionEditPlugin,对页面上的每一个章节(Section)单独编辑。
按照该插件主页上的配置说明完成配置后,还要注意插件源码 htdocs 目录下的 js 文件需要能通过“/chrome/tracsectionedit/js/tracsectionedit.js”路径访问到,否则鼠标停在章节标题上的时候,旁边不会出现编辑链接。如果是按照Web 服务器集成章节的配置文件路径配置的,那么只需要把 SectionEditPlugin 源码目录下的 js 目录复制到 Trac 的 htdocs/tracsectionedit 目录下即可。