在 Forge - Bricolage
在过去的几个月中,我们研究了许多基于 Zope 的不同内容管理系统 (CMS)。当然,在开源内容管理系统领域,Zope 并非唯一的选择。Bricolage 作为一个日益突出的软件包,主要由 David Wheeler 编写和维护,并基于 mod_perl 和 PostgreSQL。
Bricolage 的设计目标是供非技术人员使用。诚然,修改和维护 Bricolage 需要相当多的经验。但是,Apache 或 Perl 的用户通常是程序员或系统管理员,而 Bricolage 的主要用户是网站的作者、编辑和制作人员。
Bricolage 也成功地获得了相当多的实际应用经验。Apache 和 Perl 在被主流接受之前,需要多年的自我证明;Bricolage 已经成为 Salon 杂志 CMS 的一部分,并且 eWeek 和 Register 等网站也正在迁移过来。此外,一些并不以积极评价开源软件而闻名的专业出版物最近也开始评估和评测 Bricolage。大多数人都认为它是一个优秀的软件包,可以与价值数十万美元的专有软件相媲美。
本月,我们将初步了解如何安装和开始使用 Bricolage。在接下来的几个月中,我们将从多个角度对其进行考察,研究如何自定义和使用 Bricolage 来构建不同类型的网站和出版物。
每个 CMS 的核心都是数据库。商业 CMS 软件通常使用 Oracle 或 Microsoft 的 SQL Server 作为后端数据库服务器。许多开源项目,包括许多基于 PHP 的系统,都使用 MySQL。相比之下,Bricolage 使用 PostgreSQL 作为其后端存储。
PostgreSQL 通常被称为“另一个”开源数据库,长期以来一直支持事务的概念,允许您将多个数据库查询或命令组合成一个原子组。PostgreSQL 还支持其他严肃的数据库操作员所期望的功能,包括视图、用户定义的函数、子查询、联合、外键和完整性检查。PostgreSQL 还支持 Unicode,这对于处理多语言站点越来越重要。
Bricolage 使用 PostgreSQL 作为其后端存储,但应用程序本身是用 Perl 编写的。至少有两种方法可以运行用于 Web 的服务器端 Perl 程序:CGI,它速度慢、安全且可移植;以及 mod_perl,它速度快、可能不安全,并且仅适用于 Apache。Bricolage 在 mod_perl 下工作,这意味着它的代码(编写为一组 Perl 模块)会被编译一次,作为 Perl “操作码”缓存在内存中,并多次执行。因此,Bricolage 执行速度很快。
正如我上面提到的,mod_perl 仅在 Apache 下工作。虽然 Apache 2.x 的 mod_perl 的开发工作一直在进行,但在本文撰写之时(2003 年 6 月初),您应该期望 mod_perl 仅适用于 Apache 1.x。由于 Apache 1.x 作为一组进程而不是单个进程内的多个线程运行,因此无法在各个子 HTTP 服务器之间进行真正的数据库连接池。但是,可以使用 Apache::DBI 模块保持 Apache 和 PostgreSQL 之间已建立的数据库连接处于活动状态。Bricolage 正是这样做的,确保每次用户发出请求时都不需要重新建立数据库连接。
最后,Bricolage 使用一组 Perl/HTML 模板将数据呈现给最终用户。通常有很多这样的模板可用于 Perl,特别是 mod_perl。我一直是 HTML::Mason 的长期粉丝。
正如您所见,我对 Bricolage 如此热情的原因之一是它将我最喜欢的一些技术——PostgreSQL、mod_perl、Apache 和 HTML::Mason——组合到一个对最终用户友好的应用程序中。
安装 Bricolage 并非易事。这种情况不是 Bricolage 作者或维护者的错,而是因为 Bricolage 使用了来自 Comprehensive Perl Archive Network (CPAN) 的许多不同模块。目前,安装仍然不像它可能的那样顺利或容易,但随着每个版本的发布,情况都在不断改善,安装也变得越来越容易。
在您已经安装了 Perl、Apache 和 mod_perl(作为静态模块,而不是作为 Apache 动态共享对象 (DSO))之后,安装 Bricolage 最简单的方法是使用 CPAN 中定义的伪模块 Bundle::Bricolage。通常,您可以使用交互式 CPAN 工具安装 Perl 模块,首先使用以下命令启动 CPAN shell:perl -MCPAN -e 'shell'然后输入install Bundle::Bricolage在提示符下。如果您运行的是相对较新版本的 Perl,并且如果您定义了环境变量 PGINCLUDE 和 PGLIB,则所有模块都应完美下载、编译和安装。
然而,这是一个漫长而复杂的过程,如果您像我一样,使用 CPAN 并且再次尝试安装 Bundle::Bricolage 以仔细检查您是否已安装所有需要的模块,那么肯定会出错。例如,我使用交互式 CPAN shell 安装了 LWP 和 Bundle::CPAN。然后我尝试安装 Bundle::Bricolage;第一次安装(在运行 Red Hat Linux 7.3 的虚拟主机托管系统上)Cache::Cache 失败,但第二次成功。CPAN 依赖项有时可能很棘手,并非所有模块都清楚地定义和指示它们的依赖项。DB_File 也失败了(因为未安装 db3-devel 的 RPM),导致 Apache::Session 的安装出现问题,进而导致 Bricolage 依赖的 HTML::Mason 出现问题。并且,libapreq 的安装也存在问题(因为 Apache 已经在同一端口号上运行)和 XML::Parser(因为未安装 expat-devel RPM)。幸运的是,尝试安装 CPAN bundle 会(在最后)指示哪些软件包未干净地安装。您始终可以尝试重新安装 bundle,在这种情况下,CPAN shell 会告诉您哪些模块已经安装,哪些模块仍需要安装。
Bundle::Bricolage 不安装 Bricolage 模块,而是安装 Bricolage 依赖的模块。因此,在您仔细检查 Bundle::Bricolage 是否正常工作后,从 Bricolage 主页 (www.bricolage.cc) 下载最新的 Bricolage tarball,解压缩并键入make。Makefile 检查以确保已安装所有必需的和一些可选的 Perl 模块,然后询问您是否要安装任何缺少的模块。它还会检查 mod_perl 是否是静态编译的(而不是作为 DSO),以及是否已安装 PostgreSQL。最后,它会要求提供 Bricolage 设置其数据库并在系统上安装其 HTML::Mason 组件所需的一些用户名和密码。
一旦您回答了所有问题,您就可以使用以下命令开始安装:
make cpan && make test && make install
此命令从 CPAN 下载并安装必要的模块,测试 Bricolage 安装以确保其正常工作,如果一切顺利,则安装 Bricolage 本身。
安装 Bricolage 时很容易遇到一些问题,但总的来说,考虑到系统的复杂性,安装过程非常简单。Makefile 提供了智能的默认设置,强制我为“bric” PostgreSQL 用户提供密码,并总体上确保一切正常顺利运行。
一切安装完成后,我调用了bric_apachectl start启动 Apache,将我的 Web 浏览器指向根目录,并看到一个要求我登录的屏幕。安装成功了。正如 Bricolage 文档建议的那样,我立即更改了管理密码,默认情况下,该密码被适当地设置为“change me now!”。
此时我应该提到 Bricolage 使用了相当多的弹出窗口。我个人碰巧不喜欢弹出窗口,即使它们不是在广告的上下文中使用的。虽然我理解 HTML 中的用户界面性质通常需要弹出窗口才能实现信息的自然流动,但我仍然希望 Bricolage 少用它们。此外,许多内部链接都依赖于 JavaScript,这意味着我不能使用我心爱的鼠标中键打开一个新标签页而不是新窗口。但是,这个和其他小的缺陷并不能改变 Bricolage 确实是一个了不起的软件包这一事实。
Bricolage 由几个部分组成:PostgreSQL 中的数据模型、许多 Perl 模块和许多前端模板,这些模板显示由模块检索的信息。从这个意义上讲,它与其他复杂的数据库支持的系统类似。实际上,虽然 Bricolage 尝试解决的问题集比 OpenACS 更有限,并且显然使用了不同的技术来实现其目标,但数据、库和模板的分离与该系统以及许多其他使用三层架构的系统非常相似。
如果您查看 Bricolage 包的 inst 目录,您会看到系统使用的 PostgreSQL 数据库定义。如果您是 PostgreSQL 的新手,您可能会对您在那里看到的一些东西感到惊讶,例如序列和约束。
序列是 PostgreSQL 中的一种特殊类型的数字对象,其值永远不会被重用。它们最常用于确保系统中的 ID 是唯一的,尤其是在用作主键时。如果您将 PostgreSQL 列定义为 SERIAL 而不是 INTEGER,您实际上是在幕后创建了一个序列。旧版本的 PostgreSQL 使删除具有 SERIAL 列的表很不方便;您必须删除表,然后删除与 SERIAL 列关联的序列。但是,从 PostgreSQL 7.3 开始,删除表会自动删除与其 SERIAL 列关联的任何序列。
约束允许数据库拒绝将值设置在特定范围之外的 INSERT 和 UPDATE 语句。例如,Bricolage 定义了一个媒体表,其中每个元素的优先级都在 1 到 5 之间,但默认值为 3。因此,列定义如下所示:
priority NUMERIC(1,0) NOT NULL DEFAULT 3 CONSTRAINT ck_media__priority CHECK (priority BETWEEN 1 AND 5)
约束可以被赋予一个可选名称,在本例中为 ck_media_priority。这使得查找和修复错误变得更容易;如果您尝试将无效值插入此列,PostgreSQL 会指示违反的约束的名称。这在调试数据库定义以及使用数据库的应用程序的问题时非常有帮助。
同样令人惊讶的是,定义了少量函数。PostgreSQL 允许使用多种不同的语言定义函数,包括标准 SQL 和过程式 Pl/PGSQL,以及数据库增强版本的 Perl、Python 和 Tcl。
当然,Bricolage 数据模型的核心是表。person 表用于描述系统用户,org 表描述组织,然后 person_org 表处理这两个表之间的交集。
实际上,只需查看数据库定义,就可以轻松地很好地理解 Bricolage 内部发生的事情。例如,我使用默认管理用户帐户和所有默认设置向 Bricolage 添加了一个新故事——对 Core Perl 的热情洋溢的评论。这会在 story 表中插入一条新记录,为其分配优先级(如我们上面看到的)、发布和到期日期、版本号(因为 Bricolage 还处理文章的版本控制)以及故事是否已发布的指示。
几个与其他表的外键演示了这个特定文章如何融入系统。我们可以看到它是由管理用户创建的,因为 usr 列指向 usr 表;它是故事工作流的一部分,与其他已定义的工作流不同,并在 workflow__id 列的外键中引用;它来自编辑部,与其他部门(如文案、法律和出版部门)不同,并使用外键引用到 desk 表;并且它被认为是书评元素,因为它的 element__id 列指向 element 表。这些其他表中的每一个都连接到仍然提供其他辅助信息的其他表,从 burners 到组 ID 再到格式化信息。
简而言之,story 表位于 Bricolage 数据模型的中心附近——正如 CMS 围绕内容(故事是主要示例)而居中一样。实际上,如果您是关系数据库世界的新手,或者想查看一个以复杂方式使用它们的开源项目,那么您最好看看 Bricolage。
本月,我们首次了解了 Bricolage,这是一个基于 mod_perl 和 PostgreSQL 的开源内容管理系统。我们学习了如何安装和开始使用它,然后深入了解了 Bricolage 用于跟踪各种故事元素的数据模型。
下个月,我们将研究如何定义元素、类别、媒体类型和 burners,这将使我们不仅可以随意使用系统,还可以将文档发布到我们自己的私有网站。在此之后,我们将更深入地研究该系统,检查 Mason 模板,这些模板使我们能够摆脱默认的 Bricolage 外观和感觉,转向更接近我们自己个人网站所需的设计风格。
资源
有关 Bricolage 的主要信息来源是该项目的网站,位于 www.bricolage.cc)。该站点有指向可下载源代码(托管在 SourceForge 上)、文档和 Bugzilla 实例 (bugzilla.bricolage.cc) 的链接,用于提交错误报告和功能请求。
SourceForge 托管了几个 Bricolage 邮件列表,开发人员积极参与其中。如果您有疑问,或想了解新版本,您可以在 SourceForge 页面 (sourceforge.net/projects/bricolage) 上订阅。
Bricolage 文档通常相当不错,但技术性较强。O'Reilly and Associates 出版了一本更用户级的系统介绍,作为他们最近出版的书籍 Embedding Perl in HTML with Mason(作者:Dave Rolsky 和 Ken Williams)的附录。您可以在线阅读该附录,网址为 www.masonbook.com/book/appendix-d.mhtml。
有关 PostgreSQL 的更多信息,请访问该项目的主站点 www.postgresql.org。有关 Apache 的更多信息,请访问 httpd.apache.org。要了解有关 mod_perl 的更多信息,请访问 perl.apache.org。请记住,Apache 2.x 和 mod_perl 2.x 都不适合 Bricolage,尽管在您阅读本文时这种情况可能会改变。最后,您可以从 Mason 图书站点 (www.masonbook.com) 和 Mason 主页 (www.masonhq.com) 了解更多关于 Mason 的信息。
最后,您可以从 david.wheeler.net 了解更多关于 David Wheeler(Bricolage 的主要作者和维护者)的信息,并从 www.kineticode.com 了解更多关于他的公司 Kineticode 的信息。
Reuven M. Lerner (reuven@lerner.co.il) 是一位专门从事开源 Web/数据库技术的顾问。他和他的妻子 Shira 最近庆祝了他们的第二个女儿 Shikma Bruria 的诞生。Reuven 的著作 Core Perl 于 2002 年初由 Prentice Hall 出版,第二本关于开源 Web 技术的书将于 2003 年由 Apress 出版。