pkg_mkIndex(3tcl) | Tcl Built-In Commands | pkg_mkIndex(3tcl) |
pkg_mkIndex - 為包的自動裝載建造一個索引
pkg_mkIndex ?-direct? ?-lazy? ?-load pkgPat? ?-verbose? dir ?pattern pattern ...?
Pkg_mkIndex 是標準Tcl 庫中的一個實用過程。它被用於建立索引檔案,在執行 package require 的時候用它來允許自動裝載包。使用 pkg_mkIndex要依從下面這些步驟:
選項開關有:
包管理設施與自動裝載器在一些方面有所重疊,二者都安排檔案在需要時(on-demand)裝載。但是,包管理是一個高層機制,它在裝載過程的最後一步使用自動裝載器。一般的,使用pkg_mkIndex 給一個包加索引而不使用 auto_mkindex ,因為包機制提供了版本控制: 在索引檔案中可獲得一個包的多個版本,急於 package require 命令不同的應用可使用不同的版本。相反的,auto_mkindex 不理解版本,所以它只能處理每個包的一個單一版本。對一個給定的包使用 pkg_mkIndex 和 auto_mkindex 兩者來建立索引可能不是個好主意。如果你使用 pkg_mkIndex 來為一個包建立索引,它的命令不能被呼叫,一直等到使用 package require 選擇了一個版本;相反的,用 auto_mkindex 建立索引的包由於沒有版本而可以立即使用。
Pkg_mkIndex 依賴於 package unknown 命令、package ifneeded 命令、和自動裝載器。在第一次呼叫一個 package require命令時,呼叫 package unknown 指令碼。Tcl 初始化把它設定成求值在auto_path 中的所有 pkgIndex.tcl 檔案的一個指令碼。pkgIndex.tcl 檔案包含給每個可獲得的包的 package ifneeded 命令;這些命令呼叫 package provide 命令來宣佈這個包的可獲得性,並且它們設定自動裝載器的資訊來裝載這些包的檔案。 如果在生成pkgIndex.tcl 時提供了 -lazy 標誌, 在第一次呼叫它的命令之前不實際上裝載一個給定包的給定版本的一個給定檔案。所以在呼叫了 package require之後,你可能在這個直譯器中不能看到這個包的命令,但你可以呼叫它的命令而它們將被自動裝載。
一些包,例如使用了名字空間和匯出命令或要求特殊初始化的包,可以選擇在 package require 的時候立即裝載它們的包檔案而不是延遲實際的裝載到第一次使用這個包中的命令的時候。在生成包索引時這是預設的模式。可以指定 -lazy 引數來屏棄(override)它。
指令碼和二進位制檔案之間存在依賴,和包被分開成指令碼和二進位制檔案的可被正確處理。但是,你可能必須調整pkg_mkIndex 處理這些檔案的次序。下面詳細描述這些要點。
如果每個指令碼或檔案包含一個包,並且包只包含在一個檔案中,則事情就很容易。你可以簡單的用一些萬用字元模式指定以任意次序為所有檔案建立索引。
一般的,指令碼依賴於其他包是沒有問題的。如果指令碼包含 package require 命令,在用於處理這個指令碼的直譯器中把他們連根拔除(stubbed out),所以不會導致問題。如果指令碼呼叫了其他包的在全域性程式碼中的過程,這些呼叫由一個存根(stub) unknown 命令處理。但是,如果指令碼引用了其他包的在全域性程式碼中的變數 ,這將導致錯誤。這也是糟糕的編碼風格。
如果二進位制檔案依賴於其他的包,事情就變的棘手了,因為在裝載一個二進位制檔案時不可能連根拔除C-層次 API 如 Tcl_PkgRequire API。例如,假設 BLT 包要求 Tk,並在它的 Blt_Init 例程中用對 Tcl_PkgRequire 的一個呼叫表達了這種需求。要支援它,你必須在一個已經裝載了Tk 的直譯器中執行 pkg_mkIndex。你用 -load pkgPat選項來完成這個任務。如果你指定了這個選項,pkg_mkIndex將裝載在 info loaded 中列出的所有的包和那些匹配 pkgPat 的包到用於處理檔案的直譯器中。在多數情況下這將可以滿足二進位制檔案中的 Tcl_PkgRequire 呼叫。
如果你為兩個二進位制檔案建立索引,其中的一個依賴於另一個,你應該最後指定有依賴的那個包。這樣沒有依賴的那個包將被裝載和建立索引,那麼在處理第二個檔案的時候這個檔案所提供的包就是可獲得的了。你還必須使用 -load 標誌把第一個包裝載到用於建立索引的一個臨時直譯器中;這將無損於指定仍未裝載的包模式。
如果你有一個分開成一些指令碼和一個二進位制檔案的包,則你必須避免 -load 標誌。問題在於如果你在計算索引之前裝載了一個包,它將遮蔽提供同一個包的其他部分的所有其他檔案。如果你必須使用 -load,則你必須首先指定指令碼;否則從二進位制檔案裝載的包可能會遮蔽用指令碼定義的包。
package(n)
auto-load, index, package, version
寒蟬退士
2001/09/01
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
8.3 | Tcl |