我有一个奇怪的问题,我正在使用fedora 20并在系统上安装了tcllib。
但是,如果我在示例中使用package require uri,则会得到未找到响应的软件包。
有谁知道这里的问题是什么,或者如何确定是否在软件包索引中添加了tcllib?
Tcl通过两种方式查找软件包:withauto_path
和with 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
;通过一些巧妙的方法将二进制代码打包在文件中,以便可以对其进行load
编辑,但它们远远超出了此答案的范围) 。
到那时,source
当实际需要该软件包时,您将返回到文件的。无论您使用的是模块还是传统的包装,该部分都是相同的。
该模块系统比传统的搜索机制要快得多,因为它不需要打开任何文件来确定要做什么:它只需使用glob
正确的选项即可。但是,它在打包方式上不太灵活:多文件包(例如,几乎您自己制作的任何东西)都不能打包成模块(当然,如果没有额外的工作的话)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句