我有一个奇怪的问题我正在使用fedora 20并在我的系统上安装了tcllib。
但如果我在示例中使用 package require uri ,我会收到一个未找到的包。
有谁知道这里的问题是什么,或者如何确定是否在包索引中添加了tcllib?
答案 0 :(得分:2)
Tcl以两种方式查找包:使用auto_path
和tcl::tm::path
。
auto_path
- 传统机制。执行package require
时,程序包管理器会查看程序包是否已存在,或者是否存在从文件系统获取程序包的说明。如果这些都不是真的,它会要求package unknown
处理程序加载它(严格来说,它是使用package unknown
命令安装的处理程序)。该处理程序的默认实现通过查找pkgIndex.tcl
目录及其立即子目录中的auto_path
文件来加载包。
auto_path
是一个全局变量,包含要搜索的目录的 Tcl列表。你可能只是lappend
正确的地方。 pkgIndex.tcl
是一个Tcl脚本,它描述了如何使程序包可用,它通过调用适当的package ifneeded
命令来完成。 的实际加载
如果需要的软件包不存在,但其获取的说明是,则Tcl只会eval
这些说明:它们只是一个简单的旧脚本(通常只是调用source
和/或load
来执行繁重的工作。)
Tcl模块系统使用由tcl::tm::path
命令管理的不同搜索系统。 tcl::tm::path list
子命令将告诉您它的外观(一个庞大的列表,说实话),您可以使用tcl::tm::path add
子命令扩展具有额外位置的路径进行搜索。 Tcl模块将整个包放在一个文件中(扩展名为.tm
)并具有结构化名称,以便它们可以避免使用单独的pkgIndex.tcl
文件; TM加载器可以从文件名本身合成package ifneeded
调用(在所有情况下,这都是通过source
完成的;有一些聪明的方法可以在文件中打包二进制代码,因此它们可以是{{1}但是,他们远远超出了这个答案的范围。)
此时,当实际需要包时,您将返回文件的load
;无论您是使用模块还是传统包,该部分都是相同的。
模块系统比传统的搜索机制快得多,因为它不需要打开任何文件来弄清楚要做什么:它只使用source
和正确的选项。然而,事情的包装方式却不那么灵活:多文件包(例如,你自己制作的几乎任何东西)都不能制成模块(好吧,不是没有额外的工作)。