OpenACS 软件包

作者:Reuven M. Lerner

软件工程的核心思想之一是将大型项目划分为独立的模块。模块化使您可以更轻松地根据自己的特定需求定制系统,从而允许您编写新模块并删除不必要的模块。使用模块还可以更轻松地在许多不同的程序员之间分配工作。快速浏览互联网上免费提供的 Linux、Apache、Perl 和 Python 模块,可以清楚地说明这一点。

OpenACS 4(开放架构社区系统)是一个用于创建在线社区的工具包,上个月已在此处进行了初步 بررسی,在许多方面对早期版本进行了显著改进。但也许最重要的变化是将功能划分为模块,在 OpenACS 世界中,这些模块被称为“软件包”。由于每个软件包都是自包含的,并且可以将任何软件包与任何 URL 连接,因此 OpenACS 4 比以往任何时候都更容易创建灵活的社区网站。

本月,我们将初步了解 OpenACS 软件包,包括如何安装和使用它们。(本文假设您已经安装了 PostgreSQL、AOLserver 和核心 OpenACS 功能,如“At the Forge”专栏前两期所述。)由于大多数 OpenACS 站点都使用内置应用程序附带的某些功能,而不是从头开始编写所有内容,因此安装软件包是每个 OpenACS 管理员在安装核心系统后不久需要知道如何做的。

Web/数据库软件包

考虑以下用 Perl 编写的简单 CGI 程序

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
my $query = new CGI;
print $query->header();
print $query->start_html(-title => "Testing");
print "<p>This is some text</p>\n";
print $query->end_html();

如果我将此程序作为 test.pl 安装在我的 Web 服务器的 CGI 目录中,其他人可以通过检索 www.lerner.co.il/cgi-bin/test.pl 来查看其执行结果。如果我希望此程序以多个不同的名称提供,我可以复制它;我选择的名称将反映在 URL 中。

如果我的服务器端应用程序由多个 CGI 程序而不是单个程序组成,事情会变得有点棘手。如果我想在我的系统上运行多个此类应用程序套件的副本,我必须复制所有程序文件。在许多情况下,将所有文件放在一个目录中,然后每次我想在其他地方运行应用程序时都复制该目录及其所有内容会更容易。

进行此类复制会带来潜在的同步问题:如果我修复一个程序副本中的问题,我将不得不对该程序的每个副本进行相同的更改。我可以使用 CVS 解决其中一些问题,但我也可以通过仅在文件系统中保留一个程序副本来消除此问题。然后,我可以配置 Web 服务器(Apache 或 AOLserver)将一个或多个 URL 视为对我的程序的请求。

现在考虑一下,如果此应用程序套件利用了关系数据库会发生什么。安装应用程序不再像复制文件或配置 HTTP 服务器那样简单。现在,我们还需要某种方法来解决单个应用程序副本之间潜在的冲突和混淆,例如 /foo/bboard 中的论坛不会与数据库中的 /bar/bboard 混淆。如果我们要从系统中删除我们的应用程序,我们还需要一种方法来删除它使用的数据库表。

在 OpenACS 中,解决此问题的方案是 APM,即 ArsDigita 软件包管理器。APM 最初由 ArsDigita 编写,ArsDigita 是一家现已倒闭的咨询公司,该公司编写了 OpenACS 的前身。ACS 仅适用于 Oracle 数据库服务器,而 OpenACS 同时适用于 Oracle 和 PostgreSQL。

APM 处理服务器端应用程序中使用数据库时固有的许多不同问题,包括版本控制、表创建和删除脚本以及数据库独立性。APM 还被设计为允许应用程序的每个副本都具有独立的配置变量,并与一个或多个独立的 URL 相关联。

文件系统布局

APM 实际上只是一个带有 .apm 扩展名的 .tar.gz 文件。该文件通常命名如下:packagename-0.5d.apm——其中 packagename 是与软件包关联的唯一名称。此示例软件包包含开发版本 0.5。使用 tar -zxvf 打开软件包会显示标准的 文件和目录结构

  • packagename.info,一个描述软件包内容的 XML 文件。此文件通常由 OpenACS APM 应用程序自动创建,它告诉 OpenACS 哪些文件与软件包关联,以及哪些配置参数可供用户使用。它还指示应用程序是单例(即,为系统的其余部分提供服务)还是应用程序(即,可以从特定 URL 运行)。

  • sql 目录是表创建(和表销毁)脚本所在的位置。最初,当 ACS 仅支持 Oracle 时,此目录通常包含两个文件:packagename-create.sql 和 packagename-drop.sql。APM 安装程序会在安装软件包时运行 create 脚本,并在删除软件包时运行 drop 脚本。(create 脚本通常也运行 INSERT,用标准数据播种数据库表以供以后使用。)

现在 OpenACS 除了支持 Oracle 之外还支持 PostgreSQL,此目录结构已有所更改。在 sql 目录中,有 oracle 和 postgresql 目录,它们具有用于创建和删除表的并行脚本。每个已安装的 OpenACS 副本都知道它支持哪些数据库(基于 AOLserver 的 nsd.tcl 配置文件中变量的值),因此选择最合适的脚本。

  • tcl 目录包含包含过程定义的 Tcl 文件。这些过程在启动时加载到 AOLserver 中,与在 OpenACS 系统其他位置的 .tcl(或 .adp)页面中定义的过程相比,它们具有速度优势。

  • www 目录包含我们通常期望与 Web 应用程序关联的内容。这是我们放置 .tcl 和 .adp 页面以及与应用程序关联的任何图形和辅助文件的地方。OpenACS 的查询调度程序使服务器端程序可以支持多个数据库服务器,它与带有 .xql 扩展名的 XML 文件一起工作;这些文件也放在 www 目录中。

  • 由于 OpenACS 模板系统的工作方式,单个网页使用三个文件并不罕见:用于设置变量的 .tcl 文件,定义用于从数据库检索行的 SQL 查询的 .xql 文件,以及负责将信息转换为 HTML 的 .adp 文件。

APM 也可能包含许多其他文件,例如数据库升级和迁移脚本(对于那些从软件包的先前版本升级的用户)、回归测试(以确保软件包正常工作)、管理工具(在 www/admin 下)和 HTML 格式的软件包文档(在 www/doc 下)。

加载和安装软件包

使用 APM 软件包的第一步是加载它,这通常意味着将其复制到 OpenACS 系统所在的文件系统中。如果您的 OpenACS 系统位于 /web/atf/ 下,则所有软件包都位于 /web/atf/packages 下。(因此,每个软件包都需要一个唯一的名称;许多 OpenACS 开发人员使用 Emacs 风格的软件包命名约定,其中软件包名称以开发人员或客户端名称开头。这有助于避免 foo-attributes 和 bar-attributes 软件包之间的冲突。)将软件包的整个目录结构复制到 /web/atf/packages 中,确保文件和目录对于 AOLserver 运行的用户 ID 是可读(和可写)的。

安装 APM 的一种更简单、更可靠的方法是单击软件包管理器中的“加载软件包”链接。OpenACS 将要求您提供 APM 的 URL 或一个或多个软件包所在的目录的名称。然后,OpenACS 将找到位于该处的所有 .apm 文件,解压缩并将它们加载到系统中。

一旦软件包已加载到文件系统中,您必须安装其数据模型并将其注册到系统中。这通过基于 Web 的软件包管理器完成,该管理器通常位于 OpenACS 系统上的 URL /acs-admin/apm 下。通常,只有站点管理员有权访问软件包管理器。

主软件包管理器屏幕显示系统中加载的所有软件包,并指示每个软件包是否已安装、已被较新版本取代或尚未安装。使用页面顶部的菜单选项,您可以要求查看系统上软件包的不同子集,包括仅查看您个人负责开发和管理的软件包。

软件包管理器是您创建、修改、更新和安装软件包的主要方式

  • 您可以安装软件包的数据模型并将软件包注册到 OpenACS。下次 OpenACS 重新启动时,软件包的 tcl 子目录中的文件将加载到 AOLserver 的内存中。您的软件包可以通过 OpenACS 站点地图连接到 URL,我们很快就会看到。

  • 您还可以使用软件包管理器来创建新的 OpenACS 软件包。实际上,创建新的 OpenACS 软件包的第一步是使用软件包管理器来设置新的目录和 .info 文件。

  • 您可以检查当前加载到系统中的任何软件包,并检索与该软件包关联的参数、文件或任何其他信息的列表。

  • 您可以修改软件包,更改与该软件包关联的参数、文件和其他信息。

要安装新软件包,请单击页面底部的“安装软件包”链接。软件包管理器将扫描 packages 目录以查找任何新软件包,允许您选择应安装哪些软件包。(当您首次安装 OpenACS 时,未安装任何软件包,因此这是一个很长的列表。)每个软件包可能依赖于一个或多个其他软件包。如果您尝试安装一个软件包,但其先决条件依赖项尚未安装,则软件包管理器将要求您确认后再继续。

安装程序允许您决定是否要安装软件包的数据模型,或者也启用该软件包以在站点上使用。就我个人而言,我总是启用我安装的任何软件包,但我确信您可能不想这样做是有原因的。选中相应的复选框后,单击“下一步”按钮,这将安装数据模型。在此之后,您必须重新启动 AOLserver,因为许多软件包依赖于启动时加载到 AOLserver 中的 Tcl 库。因此,在服务器重新启动之前,软件包将无法工作。

挂载软件包

重新启动 AOLserver 后,转到软件包管理器并查看已启用软件包的列表。您加载的所有软件包都应该在此列表中可见。从这里,您可以修改软件包、加载更多软件包或开始将加载的软件包转换为实际的网站。此过程称为挂载,并使用 OpenACS 站点地图执行。在 OpenACS 管理中更令人困惑的部分之一是,站点地图不是站点范围管理页面的一部分;相反,它是主站点管理页面的一部分。换句话说,您在 /acs-admin/apm 下管理软件包,但在 /admin/site-map 下管理站点地图。这样做有一些充分的理由,但这往往会使人们感到困惑,而不是帮助他们。

站点地图告诉 OpenACS 如何将 URL 连接到应用程序。例如,您可能希望 OpenACS bboard 软件包位于 /forum URL 或 /bboard URL 下。在某些情况下,您实际上可能希望将其放在两个位置。站点地图允许您通过单击鼠标来执行此操作。

要首次将软件包连接到 URL,请单击 / 路径右侧的“新建子文件夹”链接。系统会要求您命名新应用程序应挂载到的 URL。要将 bboard 软件包安装在 /forum 下,您需要输入 forum(不带前导斜杠)。

如果您在此处停止,则可以将新的子文件夹视为仅仅是一个用于放置新文件夹和/或静态文档的文件夹。但是您也可以单击与此文件夹关联的“新建应用程序”链接,选择已安装的应用程序软件包,并为其指定一个人类可读的名称,该名称将用于标题栏和标题中。因此,虽然您可能将论坛放在 /bboard URL 下,但您可能希望将其命名为“Discussion forums”。此标题不能轻易更改,因此请对此过程进行一些思考。

“新建应用程序”链接创建一个新的软件包实例,然后将其附加到您创建的目录。要为此应用程序创建别名,您可以创建一个新的子文件夹,然后使用“挂载”链接。我花了一段时间才理解,“挂载”让您可以连接到现有的应用程序实例,而“新建应用程序”则创建一个全新的实例。当您考虑到卸载应用程序(使用路径名右侧的“卸载”链接)不会删除它,而是使其无法访问时,这更有意义。要完全删除应用程序的实例,您必须从站点地图中单击“已卸载的应用程序”链接,然后单击已卸载的应用程序旁边的“删除”链接。

应用程序的每个实例都有自己的权限和自己的参数。我发现参数是 OpenACS 中特别有用的部分,因为它们让我可以创建一个应用程序一次并多次使用它,但为每个实例提供自己的配置。按照站点地图上的相应链接,您可以查看或更改与软件包实例关联的参数。

结论

OpenACS 软件包以 .apm 文件形式分发,并通过 CVS 中的 APM 应用程序进行管理,从而可以创建和分发 Web/数据库应用程序。导入后,APM 软件包可以多次实例化,每个实例都有自己的权限和关联的参数。正如我们下个月将看到的那样,您还可以使用 APM 创建自己的 Web/数据库应用程序软件包,并轻松地将它们分发给同事和其他社区成员。

资源

电子邮件:reuven@lerner.co.il

Reuven M. Lerner 是一位专门从事 Web/数据库应用程序和开源软件的顾问。他的著作《Core Perl》于 2002 年 1 月由 Prentice Hall 出版。Reuven 与他的妻子和女儿住在以色列的莫迪因。

加载 Disqus 评论