这些package require
行实际上并不比它们委托给的load
和source
调用花费的时间长很多(所有包所做的都是阻止您对所有内容的路径进行硬编码,处理版本的所有细节等等)。但是,当您package require
搜索一个名称未知的包时,Tcl 必须实际搜索pkgIndex.tcl
描述如何实际加载包的文件。它通过调用您可以使用 查找(或在必要时替换)的代码来做到这一点,package unknown
这实际上非常慢。根据TCLLIBPATH
环境变量的内容,它可能会非常慢。
但是我们可以“编译”它,这样我们就可以生成source
一个文件,并能够在这台机器上快速加载这些特定的包。
为此,我们需要上面package require
的 s 和一些额外的包装代码:
package require tlautils 1.0
package require profilemanager
package require tla::log 1.2
package require res_mgr 1.1
package require resource 1.2
package require sysexits
package require utils 1.5
package require testutil 1.0
package require profilemgr
package require leakChecker
package require testutil
set f [open "pkgdefs.tcl" w]
foreach pkg [package names] {
# Skip the packages built directly into Tcl 8.6
if {$pkg in {zlib TclOO tcl::tommath Tcl}} continue
# Get the actual loaded version; known but absent would be an error
if {[catch {package present $pkg} version]} continue
# Get the actual script that we'd run to load the package.
set script [package ifneeded $pkg $version]
# Add to the file
puts $f [list package ifneeded $pkg $version $script]
}
close $f
一旦你运行了它,你就会有一个脚本pkgdefs.tcl
,你可以source
. 如果将来在执行您列出的任何呼叫之前source
运行它,那么这些呼叫将很快。(这也包括任何依赖于您列出的软件包。)但是,如果您安装了要在列表中使用的新软件包,或更新软件包的版本,或移动它们,您将需要重新构建清单:它使您的代码更加不灵活,这就是我们默认不这样做的原因。package require
package require