我的Tcl项目库组织在如下树中:
mylib :基本文件夹(有一些Tcl)文件
mylib/foo、mylib/bar (带有其他一些Tcl文件的子目录)。
特别是,我有mylib/foo/mc.tcl,提供了一个名为mc的包
# File mc.tcl
namespace eval ::mc {
namespace export dance&sing
}
proc ::mc::dance&sing { {s {Oh Tannenbaum} } } { puts "$s,...." }
package provide mc 1.4效果很好。现在,我添加了mylib/bar/by.tcl,提供了一个名称空间:by和使用包mc:
# file by.tcl
package require mc
namespace eval ::by {}
proc ::by::execute {} {
::mc::dance&sing "Sushi&more"
}
package provide by 1.1到目前为止,一切都像广告一样运作。现在,我希望(作为练习)通过导入从:mc导出的符号来更改by.tcl。这是我的零钱:
namespace eval ::by {
namespace import ::mc::dance&sing
}当通过pkg_mkIndex运行修改后的文件时,我发现生成的pkgIndex.tcl不包含包by的条目,这通常表明tcl文件中有一些错误。但是,我可以在不收到错误消息的情况下执行by.tcl。如果在我的设计中有一个错误,它必须是更微妙的。
我的TCLLIBPATH环境变量只包含基本文件夹mylib (当然是作为绝对路径)。这不应该是一个问题,因为包的文件是递归查找的。
知道这里出了什么问题吗?
我添加了一个再现问题的例子。
下面是您如何复制它:
(1)下载http://files.ronaldf.eml.cc/stovfl0.tgz并将其解压缩到某个目录(2),确保bash (或zsh)和tclsh在您的路径(3) cd中,您已将所有内容解压缩到该目录,并按如下方式运行:
bash ./run-it.sh您应该会看到类似于以下内容的输出:
pkg_mkIndex for directory ....stovfl0/mylib/foo
pkg_mkIndex for directory ....stovfl0/mylib/bar(4) cat mylib/bar/pkgIndex.tcl
你会注意到,那个包裹“by”不见了。
发布于 2014-10-06 10:23:34
不管出了什么问题都是很神秘的。当我在一个新的空目录中创建以下两个文件时:
# mc.tcl
namespace eval ::mc {
namespace export dance&sing
}
proc ::mc::dance&sing { {s {Oh Tannenbaum} } } { puts "$s,...." }
package provide mc 1.4# by.tcl
package require mc
namespace eval ::by {}
proc ::by::execute {} {
namespace import ::mc::dance&sing
::mc::dance&sing "Sushi&more"
}
package provide by 1.1然后使用tclsh8.5 (雪豹系统构建)进入该目录,并发出以下Tcl命令:
pkg_mkIndex . *.tcl然后创建这个包索引文件,这是正确的。
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script. It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands. When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.
package ifneeded by 1.1 [list source [file join $dir by.tcl]]
package ifneeded mc 1.4 [list source [file join $dir mc.tcl]]当我使用TCL8.4或TCL8.6时,我得到了完全相同的结果。
https://stackoverflow.com/questions/26202155
复制相似问题