我有一个奇怪的问题,我使用fedora 20并在我的系统上安装了tcllib。
但是,如果我使用包,需要uri,例如,我得到了一个响应中找不到的包。
有谁知道这里的问题是什么,或者如何确定tcllib是否添加到包索引中?
发布于 2014-12-14 19:10:02
Tcl以两种方式查找包:使用auto_path
和使用tcl::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
完成的;有一些聪明的方法可以在文件中打包二进制代码,以便进行load
编辑,但它们远远超出了这个答案的范围)。
此时,当实际需要包时,您将返回到文件的source
;不管您使用的是模块还是传统的包,该部分都是相同的。
模块系统比传统的搜索机制要快得多,因为它不需要打开任何文件就可以知道该做什么:它只是使用glob
来选择正确的选项。然而,在如何包装事物方面,它的灵活性较低:多文件包(例如,您自己制造的几乎任何东西)都不能被制成模块(嗯,不是没有额外的工作)。
https://stackoverflow.com/questions/27470962
复制相似问题