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 |