Package 关于TCL中包的一个问题

Package 关于TCL中包的一个问题,package,tcl,Package,Tcl,我对TCL中的软件包有一个问题 我有一个test1.tcl文件: package provide hello 0.1.0 set globalVariable 20 test2.tcl中需要此文件 package require hello 0.1.0 puts $globalVariable pkgIndex.tcl是: package ifneeded hello 0.1.0 [list source [file join $dir test1.tcl]] 当我执行test2.t

我对TCL中的软件包有一个问题

我有一个test1.tcl文件:

package provide hello 0.1.0


set globalVariable 20
test2.tcl中需要此文件

package require hello 0.1.0

puts $globalVariable
pkgIndex.tcl是:

package ifneeded hello 0.1.0 [list source [file join $dir test1.tcl]]
当我执行test2.tcl时,它告诉我,没有找到hello 0.1.0包


我尝试执行pkgIndex.tcl,它告诉我不能读取变量dir,这三个文件都在同一个文件夹下。我怎样才能修好它?有人能帮忙吗?

您需要阅读
pkg_mkIndex
的文档,其中解释了解释器如何查找要加载的包。简短的版本是:

将包安装为给定目录之一的子目录 通过
tcl\u pkgPath
变量。如果您在其他任何地方安装该软件包, 然后必须确保包含包的目录位于
auto_path
全局变量或其中一个变量的直接子目录 自动路径中的目录


在“test2.tcl”中,在执行
包require
之前,添加以下内容:

lappend auto_path [file dirname [file normalize [info script]]]

然后,Tcl可以在您当前的目录中查找pkgIndex文件。

除了Glenn和Jackson回答:Tcl解释器还可以查看TCLLIBPATH环境变量,因此将其设置为指向包含包的目录。更多信息请点击此处:。我通常在bash启动文件中放入以下行:

TCLLIBPATH="$TCLLIBPATH ~/path/to/my/package"
export TCLLIBPATH

更好的方法是使用
lappend auto_path[file dirname[info script]]
@ratzip,确保您正在设置全局变量
auto_path
,也就是说,请尝试
set::auto_path…
。请随意查阅有关全局的平行线程;-)您最好编写
set::globalVariable 20
或将其全部放在
名称空间eval
中,因为这样可以阻止程序不同部分之间的交叉交互带来的一系列可能的惊喜。