是否有任何命令可以跟踪包文件位置并显示该包中定义的过程? 如果存在此功能,那么当程序员必须维护大量软件包时,这对于搜索和快速调试会有很大帮助。
答案 0 :(得分:2)
我不知道任何直接回答你问题的命令。然而,
package ifneeded <packageName> <packageVersion>
将告诉您为了拉入包而执行的命令,这些命令通常包含一个source
命令,可以让您找出包源所在的位置。
至于确定哪个procs是在一个包中定义的,我发现这样做的最好方法是在需要包之前做info procs
来计算你定义的proc,需要包,重复info procs
命令并确定添加了什么。 Klunky,我知道,但它确实有效。
答案 1 :(得分:2)
我以前处理过类似的问题。得到你的答案毫无魔力,只有很多肘部油脂。这是我的建议:
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