全局脚本

本主题说明了 ClearQuest® 全局脚本的概念。

全局脚本用于定义可从模式中的任何挂钩调用的公共函数。全局脚本类似于子例程库;Rational® ClearQuest 软件不直接调用这些脚本。

当有多个记录类型调用同一个挂钩代码时,全局脚本十分有用。全局脚本使您能够对挂钩代码进行集中维护,避免将挂钩代码复制到多个位置。例如,Rational ClearQuest Email 程序包中包含的全局脚本允许多个操作通过调用一个全局脚本发送通知。

运行全局脚本的唯一方法是从另一个脚本调用。但是最终,调用全局脚本必须回溯到调用基于记录的挂钩,如字段挂钩、操作挂钩或记录脚本。由于调用全局脚本总能够追溯到基于记录的挂钩,因此,针对每个全局脚本均提供了隐式实体对象,可以将该对象传递给生成该调用的基于记录的挂钩。

您可使用 VBScript 和 Perl 编写脚本,但是用某种语言编写的脚本不能调用用另一种语言编写的脚本。编写全局脚本时,所采用的语言应该与编写调用该全局脚本的脚本的语言相同。

请仅在全局挂钩中使用函数,因为如果全局脚本中的代码不在函数中,那么会运行所有这些代码。

有关更多信息,请参阅编写脚本操作使用脚本的环境

要获取相关脚本的示例,请参阅全局脚本示例

使用全局脚本的子例程

对于 Perl 语言,运行挂钩时,会将变量 $entity 和 $session 作为全局变量。这些变量在运行时进行定义,可用在全局脚本代码中。但是,不可以用这些变量去调用全局脚本环境下的 EntitySession 对象方法。

如果全局脚本代码使用这些变量调用方法(例如,$entity->GetSession),那么模式验证会失败,因为 $session 和 $entity 在执行前还未定义。 例如,这段位于全局子例程之外的代码会失败,因为您无法调用还未定义($session)值的方法。
$info = $session->GetProductInfo();
将 $session 调用放在全局子例程内,也不行。例如,以下代码由于同样原因也会失败,因为它尝试在编译时解析 $productInfo
$productInfo = GetProductInfo();
   sub GetProductInfo
   {
       return $session->GetProductInfo();
   }

不能使用全局变量(如 $productInfo)调用 GetProductInfo() 来检索值。

执行 Perl 挂钩时,$session 总是设置为当前会话。但是,为实现最佳性能,应避免定义对 Session 或 Entity 对象数据敏感的全局变量;而应编写全局访问函数(如 GetUserLoginName())来检索值。

全局脚本克隆

全局脚本适合作为子例程的集合使用,可以从其他挂钩(如访问控制挂钩、初始化挂钩和验证挂钩)调用这些脚本。为此,所有全局脚本代码都会包含在用于执行每个挂钩的 Perl 代码中。 但是,全局脚本代码可以包含不属于子例程范畴(文件范畴)的语句。

从 V 7.0.1 开始,可以使用全新的经过增强的 Perl 挂钩,它可以克隆全局脚本。 采用这个增强版本,会创建 Perl 挂钩环境;编译所有全局脚本代码,然后进行克隆,创建新的挂钩环境。克隆过程可避免重新编译代码,使挂钩环境可以共享语法分析树。克隆脚本可以节省每个 Perl 挂钩环境的时间和内存,从而实现更高性能(显著改善了 Rational ClearQuest Web)。

模式开发者应考虑在编写全局脚本时如何使用克隆。如果全局挂钩采用了克隆,那么全局脚本中属于文件范畴的语句只会执行一次。然后,产生的结果会克隆到随后的 Perl 解释器中。如果禁用克隆,那么每次创建挂钩环境时都会运行此代码(对于每个记录操作,运行一次;对于每个记录脚本调用,运行一次)。

为了避免在克隆的全局脚本中运行设置代码所带来的混淆,可以将文件范畴的设置代码移到子例程中,并采用具备特殊范畴的 our 全局变量来检查设置状态。可以确保在每个挂钩环境中至少运行一次设置代码,并避免多次执行。可以从任何一个需要完成该设置的挂钩来调用这个设置子例程。例如:
  our $run_once;
   sub DoSetup
   {
       return if defined($run_once);
       $run_once = 1;
       # do setup here
   }
sub Defect_Initialization {
 DoSetup();
 # …
 # …
 #reset of Defect_Initialization code….
 # …
 }

在这段代码示例中,创建挂钩环境时,尚未定义 $run_once 变量。克隆此变量后,仍未对其进行定义。首次运行挂钩并调用 DoSetup() 时,会执行该设置代码。

注: 为了进行 Perl 全局脚本克隆,您的代码所调用的任何 Perl 库必须确保线程安全。 例如,
use Win32::OLE;
不可用于克隆的挂钩代码(但是可用于非克隆的挂钩代码,包括操作挂钩、字段挂钩和记录挂钩)。Win32::OLE 无法确保线程安全,但是可用在 ClearQuest Web 多线程环境之外。 例如,您可将
require Win32::OLE; import Win32::OLE;
用于全局脚本中,以避免对 Win32::OLE 模块进行克隆,但是,该模块不可用于随 Rational ClearQuest Web 使用的模式中。
注意: 如果 Perl 模块不在 IBM® 的控制范围内,IBM 无法确保 Perl 模块在线程这一级是安全的。有关线程安全的信息,请参阅 http://www.perl.org 中的 Perl 文档。

反馈