行は、それらが委譲するand呼び出しpackage require
よりも実際にはそれほど長くはかかりません(すべてのパッケージが行っているのは、バージョンのすべての詳細を処理するなどして、すべてへのパスをハードコーディングする必要をなくすことです)。ただし、名前がまだわかっていないパッケージを実行する場合、Tcl は実際にパッケージをロードする方法を記述したファイルを実際に検索する必要があります。これは、 を使用して検索 (または必要に応じて置換) できるコードを呼び出すことによって行われますが、これは実際には非常に低速です。環境変数の内容によっては、非常に遅くなる可能性があります。load
source
package require
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
する前にそれを実行すると、それらの呼び出しは高速になります。(これには、リストしたパッケージの依存関係にあるパッケージも含まれます。) ただし、リストで使用する新しいパッケージをインストールしたり、パッケージのバージョンを更新したり、パッケージを移動したりする場合は、パッケージを再構築する必要があります。 list: コードの柔軟性が大幅に低下するため、デフォルトではこれを行いません。package require
package require