廣域 Script

此主題解釋了 ClearQuest 廣域 Script 的概念。

您可以使用廣域 Script 來定義您可以從綱目中任何連結鉤呼叫的一般函數。 廣域 Script 就像子常式的程式庫;Rational® ClearQuest® 軟體不直接呼叫它們。

當您有多個記錄類型呼叫相同的連結鉤程式碼時,廣域 Script 很有幫助。 它們可讓您集中連結鉤程式碼維護,並避免將連結鉤程式碼複製到多個位置。 例如,包含在 Rational ClearQuest 電子郵件套件中的廣域 Script,容許多個動作呼叫一個廣域 Script 來傳送通知。

執行廣域 Script 的唯一方式是從另一個 Script 呼叫它。 不過,廣域 Script 的呼叫最後仍必須回溯至記錄型連結鉤(例如欄位連結鉤、動作連結鉤或記錄 Script)的呼叫。 因為廣域 Script 的呼叫可一律追蹤至記錄型連結鉤,所以會提供每一個廣域 Script 一個隱含的實體物件,該物件會傳遞至產生該呼叫的記錄型連結鉤。

您可以使用 VBScript 和 Perl 撰寫 Script,但一個語言類型無法呼叫另一個語言類型。 撰寫廣域 Script 時,請以呼叫它的 Script 的相同語言來撰寫它。

只在廣域連結鉤中使用函數,因為除非程式碼是在函數中,否則會執行廣域 Script 中的所有程式碼。

如需相關資訊,請參閱撰寫 Script使用 Script 作業環境定義

如需相關 Script 的範例,請參閱廣域 Script 範例

對廣域 Script 使用子常式

對於 Perl,$entity 和 $session 變數是廣域變數,當連結鉤執行時,它們會變成作用中。 這些變數是在執行時期定義,可使用於廣域 Script 程式碼中。 不過,在廣域 Script 的環境定義內,您並不使用這些變數來呼叫 EntitySession 物件方法。

如果廣域 Script 程式碼使用這些變數來呼叫方法(例如 $entity->GetSession),則綱目驗證會失敗,因為 $session 和 $entity 要等到執行時間才會加以定義。 例如,廣域子常式外的這個程式碼會失敗,因為您無法對未定義的值 ($session) 呼叫方法。
$info = $session->GetProductInfo();
將 $session 呼叫置於廣域子常式中還不夠。 例如,下列程式碼基於相同原因而失敗,因為它嘗試在編譯時期解決 $productInfo
$productInfo = GetProductInfo();
   sub GetProductInfo
   {
       return $session->GetProductInfo();
   }

不使用廣域變數(例如 $productInfo 而呼叫 GetProductInfo())來擷取此值。

在執行 Perl 連結鉤時,$session 一律設定為目前的階段作業。 不過,為達到最佳效能,請避免定義對 Session 或 Entity 物件資料敏感的廣域變數;相反的,請撰寫廣域存取元函數 (例如 GetUserLoginName())來擷取值。

廣域 Script 複製作業

廣域 Script 主要是作為可從其他連結鉤(例如:存取控制連結鉤、起始設定連結鉤和驗證連結鉤) 呼叫的子常式集合。若如此做, 所有的廣域 Script 程式碼皆納入成為 Perl 程式碼(用以執行每一個連結鉤)的一部分。不過,廣域 Script 程式碼可以包含在子常式範圍之外的陳述式(檔案範圍)。

從 7.0.1 版開始,新增的 Perl 連結鉤加強功能可用來複製廣域 Script。當啟用這項加強功能時, 會建立 Perl 連結鉤環境;所有的廣域 Script 程式碼會經過編譯和複製, 以建立新的連結鉤環境。複製程序會避免重新編譯程式碼, 並可讓連結鉤環境共用剖析樹狀結構。複製 Script 可節省每一個 Perl 連結鉤環境的時間和記憶體,提供更好的效能(尤其是對 Rational ClearQuest Web 的改進更為明顯)。

綱目開發人員在撰寫廣域 Script 時應考量如何使用複製作業。 如果已對廣域連結鉤啟用複製作業,廣域 Script 中的檔案範圍陳述式只會執行一次。 結果將複製到後續的 Perl 直譯器。 如果複製作業已失效,每次建立連結鉤環境時都會執行此程式碼(對每個記錄動作執行一次,對每個記錄 Script 呼叫執行一次)。

為避免在複製的廣域 Script 中執行設定程式碼混淆不清,請將檔案範圍內的設定程式碼移到子常式,並使用特別限定範圍的 our 廣域變數來檢查設定狀態。 您可確保設定程式碼在每一個連結鉤環境中一律至少執行一次,並避免多次執行。 可從任何需要完成設定的連結鉤呼叫此設定子常式 cab 檔。 例如:
  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 廣域 Script 複製作業要求程式碼所呼叫的任何 Perl 程式庫必須是安全執行緒。例如,
use Win32::OLE;
不應使用於複製的連結鉤程式碼中(但可使用於非複製的連結鉤程式碼,包括動作連結鉤、欄位連結鉤和記錄連結鉤)。 Win32::OLE 不是安全執行緒, 但可在 ClearQuest Web 多執行緒環境外使用。例如,您可以在廣域 Script 內使用
require Win32::OLE; import Win32::OLE;
來避免複製 Win32::OLE 模組,但該模組不應用在搭配 Rational ClearQuest Web 使用的綱目中。

意見