Tcl:找不到包,虽然auto_path和pkgIndex似乎是正确的

时间:2015-02-03 08:56:23

标签: tcl

我在Windows上安装了两个Tcl 8.4。这是一个看起来不错的人:

(在tclsh内):

% set auto_path
c:/Tcl/lib/tcl8.4 c:/Tcl/lib
% package require csv
0.8

包csv位于:

dir c:\Tcl\lib\tcllib1.15\csv
    06.06.2013  07:52            20.154 csv.tcl
    06.06.2013  07:52               126 pkgIndex.tcl

这是另一个无法找到csv包的地方:

% set auto_path
C:/cygwin64/home/fisrona/gitwrk/vp/lib/tcl8.4 C:/cygwin64/home/fisrona/gitwrk/vp/lib
% package require csv
can't find package csv 

在此安装中,包位于此处:

dir C:\cygwin64\home\fisrona\gitwrk\vp\lib\tcllib1.15\csv
    03.02.2015  08:59            20.154 csv.tcl
    03.02.2015  08:59               126 pkgIndex.tcl

在这两种情况下,auto_path都包含lib目录,包位于lib目录下的tcllib1.15 / csv。 pkgIndex.tcl在两种情况下都是相同的,如下所示:

if {![package vsatisfies [package provide Tcl] 8.4]} {return}
package ifneeded csv 0.8 [list source [file join $dir csv.tcl]]

两个安装之间必定存在不同之处,导致第二个安装失败。任何想法可能是什么原因?

BTW,两个安装中的init.tcl(在两个案例中都位于lib / tcl8.4中)也是相同的。当然,如果我将tcllib1.15目录显式添加到auto_path,则会找到包;但为什么在第一种情况下找到包,我没有添加这个目录,但在第二种情况下却没有?

==========

新发现:

good 安装中,当我需要一个不存在的包,然后再次显示auto_path时,我得到以下结果:

% set auto_path
c:/Tcl/lib/tcl8.4 c:/Tcl/lib
% package require xxx
can't find package xxx
% set auto_path
c:/Tcl/lib/tcl8.4 c:/Tcl/lib c:/Tcl/lib/tcllib1.15 c:/Tcl/lib/tcllib1.7 c:/Tcl/lib/tklib0.6 c:/Tcl/lib/vfs1.4.2/template

当需要一个未知的包时,它看起来像一个处理程序,并且这个处理程序扩展了auto_path。特别是,添加了目录tcllib1.15,其中包含csv目录。如果我在"坏"安装,我看到了:

% package require xxx
can't find package xxx
% set auto_path
C:/cygwin64/home/fisrona/gitwrk/vp/lib/tcl8.4 C:/cygwin64/home/fisrona/gitwrk/vp/lib C:/cygwin64/home/fisrona/gitwrk/vp/lib/tcllib1.7

在这种情况下,只添加了一个目录,而这不是包含csv文件的目录。

差异似乎是"未知包处理的方式"正在扩展auto_path。我只是想知道,在哪里可以找到这个处理程序?我在init.tcl中找到了以下命令:

package unknown [list ::tcl::tm::UnknownHandler [package unknown]]

我在lib / tcl8.4 / tm.tcl中找到了这个处理程序。这两个版本的文件也相同。

看起来我必须手动执行UnknownHandler以了解发生了什么......我将在此处报告我的发现。

1 个答案:

答案 0 :(得分:0)

解决!!!!!啊,这是一个多么愚蠢的错误:

虽然在两个安装中, csv目录都有一个pkgIndex.tcl文件,但在 tcllib1.15 目录中已破坏的安装中缺少此文件。

包需要csv 时,调用了handler :: tcl :: tm :: UnknownHandler,无法解析它,但随后标准处理程序(由[package unknown]返回)启动这是我在tcl8.4 / package.tcl中的安装中定义的过程 tclPkgUnknown 。此过程搜索auto_path中找到的目录中的所有条目。如果其中一个目录有一个子目录,还有一个pkgIndex.tcl文件,该文件中的条目也被考虑(并且该目录被添加到auto_path中)。

解决方案:我必须为我的目录tcllib1.15提供合适的pkgIndex.tcl。