TCL 中 packages "provide" 和 "ifneeded" 命令的用途是什么?

What is the purpose of packages "provide" and "ifneeded" command in TCL?

我想知道,packages "provide" 和 "if-needed" 命令在 TCL 中的用途是什么?请任何人澄清我的疑问。

提前致谢。

也许您只需要一个例子来了解这些命令是如何工作的。

构建可重复使用的库是 tcl 教程中的一个很好的主题,该教程解释了 package if needed、provide 和 require 如何适应。

https://www.tcl.tk/man/tcl8.5/tutorial/Tcl31.html

package provide 命令在包的定义代码中声明已定义具有特定版本的特定包。

这是一个简单的例子:

namespace eval ::foo {
    proc bar {} {
        puts "this is the bar procedure in the foo namespace"
    }
}
package provide foobar 1.1

目的是包是一个更高级别的概念,而不仅仅是“哦,这里有一堆文件,你 source”,尽管这很可能是它的实现方式。

有些人喜欢将 package provide 放在脚本的顶部。


package ifneeded 命令用于在 加载包本身之前向 Tcl 提供关于包的 元数据。它在一个名为 pkgIndex.tcl 的脚本中(通常)在与你的包实现相同的目录中,它用来说“如果你想使用名称为 this 的包和 这个 版本,运行 这个 脚本”。您需要了解的最后一点是包发现代码(运行 当您询问它不知道的包时)运行 它找到的 pkgIndex.tcl 脚本在将变量 dir 定义为包含正在 运行 的 pkgIndex.tcl 脚本的目录的上下文中;如果您使用该约定(这真的很方便),您不需要做任何特殊的事情来重新定位包。

可能与上述代码匹配的示例:

package ifneeded foobar 1.1 [list source [file join $dir foobar.tcl]]

有一个库命令可以为您生成 pkgIndex.tcl 脚本 — pkg_mkIndex — 但我不使用它,因为手写它并不困难。 (还要注意,这次我们只用一个 Tcl 脚本实现了这个包并不意味着它必须那样做。它也可以是许多脚本,或共享库,或混合脚本和共享库。包的用户不必关心这个。)