我的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和using mc:
# file by.tcl
package require mc
namespace eval ::by {}
proc ::by::execute {} {
::mc::dance&sing "Sushi&more"
}
package provide by 1.1
到目前为止,一切都像广告一样有效。现在,我希望(作为练习)通过从以下位置导入导出的符号来改变by.tcl。这是我的改变:
namespace eval ::by {
namespace import ::mc::dance&sing
}
当通过pkg_mkIndex运行修改后的文件时,我发现生成的pkgIndex.tcl不包含包的条目,这通常表示tcl文件中存在一些错误。但是,我可以执行by.tcl而不会收到错误消息。如果我的设计中存在错误,则必须更加微妙。
我的TCLLIBPATH环境变量只包含基本文件夹mylib(当然是绝对路径)。这应该不是问题,因为递归地找到包的文件。
知道这里出了什么问题吗?
我添加了一个重现问题的例子
以下是如何重现它:
(1)下载http://files.ronaldf.eml.cc/stovfl0.tgz并将其解压缩到某个目录 (2)确保bash(或zsh)和tclsh在你的PATH中 (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
你会注意到,该包裹是由'不见了。
答案 0 :(得分:1)
出现什么问题是非常神秘的。当我在一个新的空目录中创建以下两个文件时:
# 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(Snow Leopard系统版本)进入该目录,并发出此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]]
当我使用Tcl 8.4或Tcl 8.6时,我得到完全相同的。