找不到tcllib的包

时间:2014-12-14 15:46:14

标签: tcl fedora

我有一个奇怪的问题我正在使用fedora 20并在我的系统上安装了tcllib。

但如果我在示例中使用 package require uri ,我会收到一个未找到的包。

有谁知道这里的问题是什么,或者如何确定是否在包索引中添加了tcllib?

1 个答案:

答案 0 :(得分:2)

Tcl以两种方式查找包:使用auto_pathtcl::tm::path

1。 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来执行繁重的工作。)

2。 Tcl模块 - 新的(8.5)机制。

Tcl模块系统使用由tcl::tm::path命令管理的不同搜索系统。 tcl::tm::path list子命令将告诉您它的外观(一个庞大的列表,说实话),您可以使用tcl::tm::path add子命令扩展具有额外位置的路径进行搜索。 Tcl模块将整个包放在一个文件中(扩展名为.tm)并具有结构化名称,以便它们可以避免使用单独的pkgIndex.tcl文件; TM加载器可以从文件名本身合成package ifneeded调用(在所有情况下,这都是通过source完成的;有一些聪明的方法可以在文件中打包二进制代码,因此它们可以是{{1}但是,他们远远超出了这个答案的范围。)

此时,当实际需要包时,您将返回文件的load;无论您是使用模块还是传统包,该部分都是相同的。

模块系统比传统的搜索机制快得多,因为它不需要打开任何文件来弄清楚要做什么:它只使用source和正确的选项。然而,事情的包装方式却不那么灵活:多文件包(例如,你自己制作的几乎任何东西)都不能制成模块(好吧,不是没有额外的工作)。