是否有任何命令可以跟踪包文件位置并显示在该包中定义的过程?如果这个功能存在,当程序员必须维护大量的包时,这将对搜索和快速调试有很大的帮助。
我以前处理过一个类似的问题。要得到你的答案并没有什么魔力,只是需要大量的体力劳动。以下是我的建议:
- 在导入包之前,请记录名称空间和命令列表
- 导入相关包
- 重新记录名称空间和命令列表
- 从"before"one_answers"after"列表中,我们可以得到一个新的名称空间和命令列表
- 我使用数组
stat
来简化调试:在开发代码期间,我可以只使用parray stat
来调试 - 诸如
csv
之类的包将新命令整齐地放在同名的名称空间中:::csv
,而其他诸如Tcx
之类的包将内容放在全局名称空间中。我们需要解决这两种情况
警告
- 一个包可能会导入其他包,这会丢掉计数(名称空间和命令)
- 我不知道
info commands
和info procs
的区别。我总是使用前者 - 过程
packageStatistics
需要一个有效的包名。给它一个无效的名字,将会发生意想不到的行为
package require struct::set
proc packageStatistics {packageName} {
# Record "before" statistics
set stat(ns,before) [namespace children]
set stat(cmd,before) [info commands]
# Now, import the package in question
set stat(version) [package require $packageName]
# Record "after" statistics
set stat(location) [package ifneeded $packageName $stat(version)]
set stat(ns,after) [namespace children]
set stat(cmd,after) [info commands]
# Report package name, version and location
puts "Package: $packageName version $stat(version)"
puts "Location:"
puts "$stat(location)"
# Show a list of extra commands in the global namespace
puts "Commands:"
set stat(cmd,new) [lsort [struct::set difference $stat(cmd,after) $stat(cmd,before)]]
foreach cmd $stat(cmd,new) {
puts "- $cmd"
}
# Show a list of extra commands in each of the extra namespace
set stat(ns,new) [lsort [struct::set difference $stat(ns,after) $stat(ns,before)]]
foreach ns $stat(ns,new) {
foreach cmd [info commands ${ns}::*] {
puts "- $cmd"
}
}
}
packageStatistics csv
输出Package: csv version 0.7.2
Location:
source /System/Library/Tcl/tcllib1.12/csv/csv.tcl
Commands:
- ::csv::writematrix
- ::csv::split
- ::csv::Split
- ::csv::writequeue
- ::csv::join
- ::csv::read2matrix
- ::csv::read2queue
- ::csv::split2matrix
- ::csv::Split2matrix
- ::csv::split2queue
- ::csv::joinlist
- ::csv::report
- ::csv::joinmatrix
- ::csv::iscomplete
我不知道有什么命令能直接回答你的问题。然而,
package ifneeded <packageName> <packageVersion>
将告诉您为了拉入包而执行的命令,其中通常包括一个source
命令,让您确定包源位于何处。
至于在包中定义了哪些过程,我发现这样做的最好方法是执行info procs
来计算在需要包之前定义了哪些过程,然后需要包,重复info procs
命令并确定添加了什么。我知道很怪,但是很管用。